Ceci une application de TODO List pour remplacer le carnet qui me suit partout. Cette application sera utilisée en plusieurs phases : planification ou action.
Au lancement l'application est en mode planification.
commit
[#app phase: "planification"]
Elle affiche une liste de toutes mes tâches en cours, et permet de les manipuler selon le système "Autofocus" (voir section dédiée).
search
[#tache libelle timestampCreation]
tache = [#tache]
app = [#app phase]
bind @browser
[#h1 text: "TODO"]
[#p text: "Phase actuelle : {{app.phase}}"]
[#ul children:
[#li #todo tache
sort: tache.timestampCreation
text: "{{tache.libelle}}"]]
Les tâches sélectionnées sont affichées en rouge, et les tâches terminées sont barrées et grisées :
search @browser @session
élémentSélectionné = [#todo tache: [#tache #sélectionnée]]
élémentTerminé = [#todo tache: [#tache #terminée]]
bind @browser
élémentSélectionné.style := [color: "red"]
élémentTerminé.style := [
color: "grey"
text-decoration: "line-through"
font-style: "italic"
font-size: "0.9em"]
Si aucune tâche n'existe on affiche un message zen
search
not([#tache])
bind @browser
[#h1 text: "Rien n'est plus beau que le vide"]
[#p text: "Bravo pour ta productivité. Il est temps de profiter des tiens"]
Il est possible de saisir une nouvelle tâche à faire à tout moment.
bind @browser
[#div sort: 1000 children:
[#input #nouvelle-tache placeholder: "acheter du lait"]]
Lors de l'ajout, la tâche est ajoutée à la fin des tâches en cours et non sélectionnée
search @event @session @browser
element = [#nouvelle-tache value]
kd = [#keydown element, key: "enter"]
commit @session @browser
[#tache libelle: value]
element.value := ""
Le système Autofocus consiste en des étapes différentes.
Lorsqu'une tâche est ajoutée au système, elle l'est toujours en fin de liste (car c'est la plus récente).
search
tache = [#tache]
not(tache = [timestampCreation])
[#time timestamp]
commit
tache <- [timestampCreation: timestamp]
La planification débute par la sélection de la tâche la plus ancienne
search
[#app phase: "planification"]
sort[value: timestampCreation] = 1
plusAncienneTâche = [#tache timestampCreation]
bind
plusAncienneTâche += #sélectionnée
Le but dans cette étape est de parcourir la liste de tâches situées après la dernière tâche sélectionnée ("tâche X")
search
[#app phase: "planification"]
sort[value: timestampCreationSelected direction: "down"] = 1
[#tache #sélectionnée timestampCreation: timestampCreationSelected]
tâchesSélectionnables = [#tache timestampCreation not(#terminée)]
timestampCreation > timestampCreationSelected
bind @view @session
tâchesSélectionnables += #sélectionnable
[#value | value: tâchesSélectionnables.libelle]
et de se demander pour chacune d'entre elle : "Est-ce que je veux réaliser cette tâche Y avant la tâche X ?"
search @event @browser
[#click]
bind @view
[#value | value: "clicked"]
La réponse dépendra du contexte, de la volonté et de l'urgence par exemple. Si on répond "Oui" à cette question, alors sélectionner cette tâche et recommencer l'opération pour les tâches ultérieures à celles-ci.
search @browser @session @event
tache = [#tache #sélectionnable]
[#click element: [#todo tache]]
bind @view
[#value | value: tache.libelle]
Pour aider à la détection visuelle des tâches sélectionnables, l'application rendra plus transparentes les non sélectionnables et rendra cliquables les sélectionnables.
search @browser @session
élémentSélectionnables = [#todo tache: [#tache #sélectionnable]]
élémentNonSélectionnables = [#todo tache: [#tache not(#sélectionnable)]]
bind @browser
élémentSélectionnables.style := [color: "green" cursor: "pointer"]
élémentSélectionnables.title := "Sélectionner"
élémentNonSélectionnables.style := [opacity: 0.3]
Une fois qu'aucune tâche ultérieure à la dernière sélectionnée ne souhaite être réalisée, il est temps de repasser en mode "Action".
Au passage en mode action, le but est de se focaliser sur la tâche la plus récente sélectionnée. L'interface présente donc uniquement son contenu à l'utilisateur.
TODO
L'utilisateur décide alors de travailler sur cette tâche autant de temps qu'il le souhaite (5 minutes comme 2 heures).
Lorsque l'utilisateur souhaite arrêter de travailler sur la tâche en cours (qu'elle soit terminée ou non), il peut cliquer sur un bouton pour notifier l'application.
TODO
La tâche en cours est alors marquée comme terminée et ajoutée à nouveau en fin de liste.
TODO
Dans la cas où d'autres tâches (antérieures) avaient été sélectionnées en phase de planification, la tâche sélectionnée la plus récente devient alors la tâche en cours et la session de travail peut reprendre.
TODO
Dans le cas où la tâche venant de se terminer était la dernière sélectionnée (donc la tâche la plus ancienne), l'application repasse en phase "Planification".
TODO
Afin d'avoir une interface un peu cohérente voici des exemples de données :
search
app = [#app]
not(app = [#init])
[#time timestamp]
commit
app += #init
[#tache libelle: "Se doucher" timestampCreation: timestamp - 20]
[#tache libelle: "Nettoyer" #terminée timestampCreation: timestamp]
[#tache libelle: "Ranger" #sélectionnée timestampCreation: timestamp - 2]
[#tache libelle: "Dormir" timestampCreation: timestamp + 20]
[#tache libelle: "Ronfler" timestampCreation: timestamp + 21]
[#tache libelle: "Faire du café"]
Pour reproduire : saisir une nouvelle tâche et taper entrée Ce qu'il se passe : la tâche est ajoutée, mais le champ reste rempli avec la valeur saisie Attentue: tâche ajoutée mais champ vidé