URL: https://linuxfr.org/news/developper-une-interface-web-avec-le-toolkit-atlas-1-2 Title: DĂ©velopper une interface web avec le toolkit Atlas (1/2) Authors: Claude SIMON Ysabeau đŸ§¶ Date: 2020ćčŽ12月21æ—„T17:19:56+01:00 License: CC By-SA Tags: web, spa, python et atlas_toolkit Score: 23 Le *toolkit* *Atlas* permet de programmer des interfaces d’applications web monopages ([SPA](https://en.wikipedia.org/wiki/Single-page_application)). Il est lĂ©ger (quelques dizaines de Ko), sans dĂ©pendances, ne nĂ©cessite pas de savoir programmer en *JavaScript*, et n’impose pas d’architecture logicielle de type [*MVC*](https://fr.wikipedia.org/wiki/Mod%C3%A8le-vue-contr%C3%B4leur). En outre, toute application dĂ©veloppĂ©e avec le *toolkit* *Atlas* est, dĂšs son lancement, instantanĂ©ment et automatiquement accessible de n’importe quel dispositif (smartphone, tablette...) Ă©quipĂ© d’un navigateur web moderne connectĂ© Ă  Internet. Cet accĂšs est facilitĂ© par un [code QR](https://fr.wikipedia.org/wiki/Code_QR) qui s’affiche dans l’application. Le *toolkit* *Atlas* a dĂ©jĂ  fait l’objet de [quelques publications](https://linuxfr.org/tags/atlas_toolkit/public) ici mĂȘme. Pour varier un peu les plaisirs durant ces longues soirĂ©es ~~d’hiver~~ de couvre-feu, voici la premiĂšre partie d’un document qui devrait faciliter l’utilisation du *toolkit* *Atlas*. Il dĂ©taille le dĂ©veloppement d’une application (trĂšs) basique de gestion de contacts, dont l’apparence est la suivante : ![Apparence de l'application faisant l'objet du tutoriel 'Contacts'](https://q37.info/s/39dr4tcr.png) Le *toolkit* *Atlas* est disponible pour *Java*, *Node.js*, *Perl*, *Python* et *Ruby*. C’est la version la plus populaire, Ă  savoir *Python*, qui est utilisĂ©e pour ce document. Cependant, l’API Ă©tant la mĂȘme pour toutes les versions, on peut facilement le transposer aux autres langages disponibles. ---- [Homepage](https://atlastk.org) [Sur GitHub](https://github.com/epeios-q37/atlas-python) [Sur Repl.it](https://repl.it/@AtlasTK/atlas-python) [API](https://atlastk.org/api/fr) [Seconde partie](https://linuxfr.org/news/developper-une-interface-web-avec-le-toolkit-atlas-2-2) ---- # À propos de ce document L’accent Ă©tant mis sur la mise en Ɠuvre de l'*API* du *toolkit* *Atlas*, le lecteur est supposĂ© possĂ©der les connaissances (basiques) nĂ©cessaires Ă  la comprĂ©hension du code *HTML*/*CSS* et *Python* prĂ©sent dans ce document. Les fichiers sources associĂ©s Ă  ce document sont disponibles dans un [dĂ©pĂŽt *GitHub*](https://github.com/epeios-q37/atlas-python/tree/master/tutorials/Contacts), lui-mĂȘme clonĂ© [sur *Repl.it*](https://repl.it/@AtlasTK/atlas-python), un *IDE* en ligne. Si *Python* 3 est installĂ© sur votre ordinateur, vous pouvez rĂ©cupĂ©rer le dĂ©pĂŽt *GitHub* et visualiser/exĂ©cuter directement sur votre machine le code associĂ© aux diffĂ©rentes sections de ce document. Vous pouvez Ă©galement, notamment si vous n’avez pas installĂ© *Python* 3, visualiser/exĂ©cuter, Ă©ventuellement aprĂšs modification, ce code directement dans votre navigateur en utilisant le lien *Repl.it* ci-dessus. Pour ne pas allonger outre mesure ce document, chaque section ne contiendra que les dĂ©tails du code sur lequel elle porte. NĂ©anmoins, au dĂ©but de chaque section, il y aura un lien vers le code source complet tel que dĂ©crit dans cette section, ainsi que les instructions Ă  lancer pour l’exĂ©cuter sur *Repl.it* et en local. Les lignes, dans les fichiers source, prĂ©cĂ©dant la ligne `import atlastk` ne sont lĂ  que pour faciliter l’utilisation de ces fichiers dans le cadre de ce document et ne sont pas nĂ©cessaires Ă  une utilisation courante du *toolkit* *Atlas*. # Le ficher *HTML* principal (`Main.html`)> Code source : [lien sur GitHub](https://github.com/epeios-q37/atlas-python/blob/master/tutorials/Contacts/Main.html). Le fichier `Main.html` est un fichier au format *HTML* dĂ©crivant l’interface. Ce fichier va prendre place dans la section *body* de la page *HTML* constituant l’interface de l’application. ## Structure gĂ©nĂ©rale Voici un aperçu partiel du contenu de ce fichier, mettant en Ă©vidence sa structure gĂ©nĂ©rale : ```html
``` Il est aisĂ©ment comprĂ©hensible de celles et ceux qui sont familiers avec *HTML*. Ses diffĂ©rentes sous-parties, qui prennent la place de commentaires ci-dessus, vont ĂȘtre dĂ©taillĂ©es ci-dessous. ## DĂ©tail d’un contact Voici le code dĂ©diĂ© Ă  l’affichage du dĂ©tail d’un contact : ```html
``` On y trouve un tableau, avec, pour chacun des champs constituant un contact, une ligne (chacune dĂ©limitĂ©e par `` et ``) accompagnĂ©e d’un libellĂ© et d’un identifiant explicite. ## Boutons gĂ©nĂ©raux Ces boutons vont servir Ă  crĂ©er/Ă©diter/supprimer un contact. En voici le code : ```html ``` À part l’attribut `data-xdh-onevent`, on n’a lĂ  que du *HTML* des plus classiques. Les diffĂ©rentes classes (valeurs `Display` et `DisplayAndSelect` des attributs `class`) ont cependant un rĂŽle bien particulier, qui sera rĂ©vĂ©lĂ© dans les sections qui suivent. L’attribut `data-xdh-onevent` prend ici la place de l’habituel attribut `onclick`. L’attribut `onclick` prend habituellement pour valeur le code *JavaScript* Ă  lancer lorsque l’on clique sur le bouton auquel il est affectĂ©. Ici, Ă  la place, on utilise l’attribut `data-xdh-onevent`, qui va prendre pour valeur un libellĂ© d’action, libellĂ© que l’on retrouvera dans le code *Python*. On va pouvoir ainsi coder les actions Ă  rĂ©aliser lors d’un clic sur le bouton non plus en *JavaScript*, mais en *Python*. ## Boutons de saisie Ces boutons sont affichĂ©s lors de la saisie d’un contact, et permettent de valider ou d’annuler cette saisie. Voici le code correspondant : ```html ``` LĂ  encore, rien de particulier, mis Ă  part l’attribut `data-xdh-onevent`, que l’on a dĂ©jĂ  rencontrĂ© ci-dessus. Le contenu des attributs `data-xdh-onevent`, Ă  savoir `Cancel` et `Submit`, va ĂȘtre utilisĂ© dans le code *Python* de l’application. Notez qu’ici le nom du bouton (la valeur de l’élĂ©ment `button`) est identique Ă  la valeur de son attribut `data-xdh-onevent`. C’est uniquement par commoditĂ© ; ce n’est en rien obligatoire. ## Liste de contacts Cette partie affiche le tableau qui va accueillir la liste des contacts au sein de son Ă©lĂ©ment `tbody`, dont le contenu va ĂȘtre gĂ©nĂ©rĂ© par l’application. En voici le contenu : ```html
Name Address Phone Note
``` Notez l’identifiant `Content`, que l’on va retrouver dans le code *Python*. L’identifiant `Contacts` n’est, lui, utilisĂ© que dans le fichier `Head.html` dĂ©crit ci-dessous. # Le fichier *HTML* des mĂ©tadonnĂ©es (`Head.html`)> Code source : [lien sur GitHub](https://github.com/epeios-q37/atlas-python/blob/master/tutorials/Contacts/Head.html). Ce fichier, Ă©galement au format *HTML*, prendra place dans la section *head* de la page *HTML* constituant l’interface de l’application. ## Apparence de l’application La premiĂšre partie de ce fichier dĂ©finit le titre, l’icĂŽne, et, Ă  l’aide de quelques rĂšgles *CSS*, diverses retouches au niveau de l’apparence de l’interface. En voici le contenu : ```html Address book ``` ## VisibilitĂ© des boutons La seconde partie du fichier permet de gĂ©rer la visibilitĂ© des boutons. En voici le contenu : ```html ``` On y voit des Ă©lĂ©ments `style` accompagnĂ©s d’un identifiant. Ces Ă©lĂ©ments vont permettre de cacher/afficher certains boutons. En effet, chaque Ă©lĂ©ment `style` dĂ©finit une rĂšgle pour une certaine classe. En activant/dĂ©sactivant un de ces Ă©lĂ©ments, on ajoute/retire Ă  cette classe la rĂšgle *CSS* contenu dans l’élĂ©ment. Par consĂ©quent, on agit ainsi sur les Ă©lĂ©ments, en l’occurrence des boutons, auxquels cette classe est affectĂ©e. On retrouvera les diffĂ©rents identifiants de ces Ă©lĂ©ments `style` dans le code *Python* dĂ©taillĂ© dans les sections qui suivent. # Rendu de l’interface (`part1.py`)> * Code source : [lien sur GitHub](https://github.com/epeios-q37/atlas-python/blob/master/tutorials/Contacts/part1.py) ;> * exĂ©cution :> * sur [*Repl.it*](https://repl.it/@AtlasTK/atlas-python#tutorials/Contacts/part1.py) : bouton *Run*, `n1` + *entrĂ©e*, clic sur URL,> * en local : `python3 atlas-python/tutorials/Contacts/part1.py` On va ici afficher l’interface de l’application, dont, suite Ă  une action de l’utilisateur, seules les parties qui le nĂ©cessitent seront modifiĂ©es. ## Affichage de la page *HTML* En premier lieu, on va dĂ©finir la fonction qui sera appelĂ©e Ă  chaque ouverture de session : ```python def ac_connect(dom): dom.inner("",open("Main.html").read()) ``` `dom` est un objet fournit par le *toolkit* *Atlas* ; chaque session a sa propre instance de cet objet. Dans cette fonction, la mĂ©thode `inner(...)`va remplacer la totalitĂ© de la page web par le contenu du fichier `Main.html` prĂ©cĂ©demment dĂ©crit. Le premier paramĂštre de cette mĂ©thode est l’identifiant de l’élĂ©ment dont on va remplacer le contenu. La chaĂźne vide est une valeur spĂ©ciale qui fait rĂ©fĂ©rence Ă  l’élĂ©ment racine de la page. À titre indicatif, il existe Ă©galement les mĂ©thodes `before(...)`, `begin(...)`, `end(...)` et `after(...)` pour insĂ©rer le contenu respectivement juste avant, au dĂ©but, Ă  la fin ou juste aprĂšs l’élĂ©ment dont l’identifiant est passĂ© en paramĂštre. On va ensuite affecter cette fonction Ă  une action, Ă  l’aide d’un dictionnaire nommĂ©, par convention, `CALLBACKS` : ```python CALLBACKS = { "": ac_connect } ``` Ici, `ac_connect` est affectĂ© Ă  une action dont le libellĂ© est une chaĂźne vide. Cette valeur correspond Ă  l’action qui est lancĂ©e Ă  chaque nouvelle session. ## La boucle Ă©vĂšnementielle On va ensuite lancer la boucle Ă©vĂšnementielle de l’application, en lui passant le dictionnaire des actions, ainsi que le contenu du fichier `Head.html` dĂ©crit prĂ©cĂ©demment : ```python atlastk.launch(CALLBACKS,None,open("Head.html").read()) ``` Le paramĂštre dont la valeur est `None` sera abordĂ© plus tard. # Liste des contacts (`part2.py`)> * Code source : [lien sur GitHub](https://github.com/epeios-q37/atlas-python/blob/master/tutorials/Contacts/part2.py) ;> * exĂ©cution :> * sur [*Repl.it*](https://repl.it/@AtlasTK/atlas-python#tutorials/Contacts/part2.py) : bouton *Run*, `n2` + *entrĂ©e*, clic sur URL,> * en local : `python3 atlas-python/tutorials/Contacts/part2.py` Dans cette section, nous allons programmer l’affichage de la liste des contacts. ## Liste fictive On va d’abord crĂ©er une liste de contacts fictive, histoire d’avoir quelque chose Ă  afficher : ```python EXAMPLE = [ { "Name": "Holmes, Sherlock", "Address": "221B Baker Street, Londres", "Phone": "(use telegraph)", "Note": "Great detective!" }, { "Name": "Holmes, Mycroft", "Address": "Diogenes Club, Pall Mall, Londres", "Phone": "(use telegraph)", "Note": "Works for the British government.\nBrother of Holmes, Sherlock." }, { "Name": "Tintin", "Address": "ChĂąteau de Moulinsart", "Phone": "421", "Note": "Has a dog named Snowy." }, { "Name": "Tournesol, Tryphon (prof.)", "Address": "ChĂąteau de Moulinsart", "Phone": "421", "Note": "Creator of the Bianca rose." } ] ``` On va affecter cette liste Ă  une variable qui fera office de base de donnĂ©es : ```python contacts = EXAMPLE ``` ## Affichage CrĂ©ons une fonction dĂ©diĂ©e Ă  l’affichage de cette liste : ```python def display_contacts(dom): html = "" for contactId in range(len(contacts)): contact = contacts[contactId] html += f'' for key in contact: html += f'{contact[key]}' html += '' dom.inner("Content", html) ``` Dans cette fonction, on rĂ©cupĂšre chaque contact de la liste, et, pour chacun de ces contacts, le contenu de chacun de ses champs. On va s’en servir pour crĂ©er le contenu du corps du tableau dĂ©diĂ© Ă  l’affichage de la liste, contenu qui sera stockĂ© dans la variable `html`. Le contenu de cette variable est ensuite injectĂ© dans le corps de la table, plus prĂ©cisĂ©ment dans l’élĂ©ment `tbody` d’identifiant `Content` (voir le fichier `Main.html`), grĂące Ă  la mĂ©thode `inner(...)`, que l’on a dĂ©jĂ  rencontrĂ©e. Notez que le premier paramĂštre n’est plus, comme auparavant, une chaĂźne de caractĂšres vide, mais bien l’identifiant de l’élĂ©ment concernĂ©, Ă  savoir `Content`. Chaque ligne du tableau a son propre identifiant, et un attribut `data-xdh-onevent="Select"` qui fera l’objet de la prochaine section. Enfin, on ajoute l’appel Ă  cette fonction dans la fonction `ac_connect(...)`, : ```python def ac_connect(dom): dom.inner("",open("Main.html").read()) display_contacts(dom) ``` # DĂ©tail d’un contact (`part3.py`)> * Code source : [lien sur GitHub](https://github.com/epeios-q37/atlas-python/blob/master/tutorials/Contacts/part3.py) ;> * exĂ©cution :> * sur [*Repl.it*](https://repl.it/@AtlasTK/atlas-python#tutorials/Contacts/part3.py) : bouton *Run*, `n3` + *entrĂ©e*, clic sur URL,> * en local : `python3 atlas-python/tutorials/Contacts/part3.py` ProcĂ©dons maintenant Ă  l’affichage des dĂ©tails d’un contact sĂ©lectionnĂ© par l’utilisateur. ## Affichage On va commencer par le remplissage des champs au sommet de l’interface avec les valeurs du contact sĂ©lectionnĂ© dans la liste. Voici la fonction correspondante : ```python def display_contact(contactId,dom): dom.set_values(contacts[contactId]) ``` La mĂ©thode `set_values(...)` prend un dictionnaire avec, pour clefs, des identifiants d’élĂ©ments, et, pour valeurs, le contenu que doivent prendre ces Ă©lĂ©ments. Comme, dans la page *HTML*, les identifiants des Ă©lĂ©ments sont identiques aux clefs correspondant aux champs d’un contact, le dictionnaire est dĂ©jĂ  constituĂ© et n’est plus Ă  construire. On l’utilise donc tel quel dans l’appel de la mĂ©thode `set_values(...)`. `contactId` est l’index, dans la liste `contacts`, du contact Ă  afficher. ## SĂ©lection On va maintenant dĂ©finir la fonction que l’on va affecter Ă  l’action `Select` dĂ©finit dans l’attribut `data-xdh-onevent` du code *HTML* qui est crĂ©e dans la prĂ©cĂ©dente section : ```python def ac_select(dom,id): display_contact(int(id),dom) ``` Le paramĂštre `id` contient l’identifiant de l’élĂ©ment recevant l’évĂšnement Ă  l’origine de l’action Ă  laquelle cette fonction a Ă©tĂ© affectĂ©e. Ici, l’évĂšnement est un clic sur une ligne du tableau contenant la liste des contacts, Ă©vĂšnement auquel a Ă©tĂ© associĂ©e l’action `Select` via l’attribut `data-xdh-onevent`. ConformĂ©ment Ă  ce qui va ĂȘtre dĂ©fini ci-dessous dans la variable `CALLBACKS`, cette action va lancer la fonction `ac_select`. Dans la section prĂ©cĂ©dente, on a vu que, pour le tableau *HTML* contenant la liste des contacts, chaque ligne a pour identifiant l’index, dans la table `contacts`, du contact correspondant. On peut donc utiliser directement `id`, aprĂšs l’avoir converti en entier (`id` est fourni sous forme d’une chaĂźne de caractĂšres), pour le passer Ă  la fonction `display_contact(...)` On met Ă  jour la table `CALLBACKS`, en affectant cette fonction Ă  l’action `Select` (dĂ©finie comme valeur de l’attribut `data-xdh-onevent` dans le code *HTML* gĂ©nĂ©rĂ© dans la prĂ©cĂ©dente section) : ```python CALLBACKS = { ... "Select": ac_select } ``` # *À suivre...* Sur les recommandations de l’équipe de modĂ©ration, ce document a Ă©tĂ© dĂ©coupĂ© en deux dĂ©pĂȘches. Celle-ci prĂ©sentait le fichier *HTML* principal, celui des mĂ©tadonnĂ©es, ainsi que les principales fonctions relatives Ă  l’affichage. La [seconde dĂ©pĂȘche](https://q37.info/s/jz9ttdjb) portera sur la gestion des Ă©vĂšnements.

AltStyle ă«ă‚ˆăŁăŠć€‰æ›ă•ă‚ŒăŸăƒšăƒŒă‚ž (->ă‚ȘăƒȘă‚žăƒŠăƒ«) /