View in color | License | Download script | History | Other scripts by: xpteamer |
15-Sep 8:04 UTC
[0.176] 151.556k
[0.176] 151.556k
xpdev.rrebol [
Library: [
level: 'intermediate
platform: 'all
type: tool
domain: 'files
tested-under: windows XP SP2
support: none
license: none
see-also: none
]
title: "XPDev"
Date: 23-May-06
File: %xpdev.r
purpose: "XPDev is a program that helps XP devellopers to manage documentation"
Rights: {Xavier Debecq/XPTeamer. Realesed under no licence but please send me feedback}
version: [0.0.2 [24-mar-06]]
level: 'beginner
support: none (at this time/it s a work for my graduation)
]
I-O-problem: copy []
repository-url: copy []
; fonctions de creation
;creation d'un projet
create-project: func [
"cree le projet"
] [
I-O-problem: copy []
object-project: make object! [
names: ""
users: copy []
date: date!
description: string!
iterations: copy []
stories-pool: copy []
]
either not attempt [
delete-dir %/C/XPDev
change-dir make-dir/deep %/C/XPDev/objects/object-project
save %object-project.o object-project
return true
]
[
append I-O-problem "problem with the creation of the project"
return false
]
[
return true
]
]
;creation et ajout d'un utilisateur
create-add-user: func [
"cree des users et les attache au projet"
name-new-user [string!] "nom du nouvel utilisateur"
email-new-user [email!] "email du nouvel utilisateur"
] [
I-O-problem: copy []
either not attempt [
;ici on crée l'user
user: reduce [
name-new-user
reduce [
email-new-user
]
]
object-project: load-project
append object-project/users user
save-project object-project
return true
]
[
append I-O-problem "problem with the creation of the user"
return false
]
[
return true
]
]
;creation et ajout d'une itération au projet
create-add-iteration: func [
"cree des iterations et les rattache au projet"
date-debut [date!] "date de début de l'itération"
date-fin [date!] "date de fin de l'itération"
description [string!] "description de l'itération"
title [string!] "titre de l'itération"
]
[
I-O-problem: copy []
object-iteration: make object! [
tit: string!
desc: string!
date-begining: date!
date-end: date!
state: string!
stories-iteration: copy []
]
object-iteration/tit: title
object-iteration/desc: description
object-iteration/date-begining: date-debut
object-iteration/date-end: date-fin
object-iteration/state: "iddle"
either not attempt
[
id: to-string get-time-stamp
object-project: load-project
append object-project/iterations id
append object-project/iterations title
save-project object-project
make-dir/deep %/C/XPDev/objects/object-iterations
test: to-file join id ".o"
save-iteration test object-iteration
return true
]
[
append I-O-problem "problem with the creation of the iteration"
return false
]
[
return true
]
]
;creation et ajout d'une task a la story
create-add-task: func [
"crée une task et les rattache au projet"
id-story [string!] "identifiant de la story a laquelle la task se rattache"
my-date-task [date!] "date de début de la task"
my-title-task [string!] "titre de la task"
my-story-task [string!] "story qui contient la task"
my-in-task [string!] "variables d'entrées de la task"
my-out-task [string!] "variables de retour de la task"
my-responsabilities-task [string!] "buts de la taches"
my-collaborations-task [string!] "collaborations de la taches"
] [
I-O-problem: copy []
object-task: make object! [
story-task: copy []
date-task: my-date-task
title-task: my-title-task
in-task: my-in-task
out-task: my-out-task
responsabilities-task: my-responsabilities-task
collaborations-task: my-collaborations-task
task-tests: copy []
log: copy []
task-state: "iddle"
]
either not attempt
[
id: to-string get-time-stamp
object-story: load-story id-story
append object-story/tasks-pool id
append object-story/tasks-pool my-title-task
append object-task/story-task id-story
save-story to-file join id-story ".o" object-story
make-dir/deep %/C/XPDev/objects/object-tasks/
save-task to-file join id ".o" object-task
return true
]
[
append I-O-problem join "problem with the creation of the task"
return false
]
[
return true
]
]
;creation et ajout d'une story au projet
create-add-story: func [
"crée une story et les rattache au projet"
my-date-story [date!] "date de début de la story"
my-description-story [string!] "description de la story"
my-title-story [string!] "titre de la story"
my-estimate-story [integer!] "estimation en points de la story"
my-risk-story [integer!] "estimation du programmeur du risque technique"
my-user-prior-story [integer!] "priorité de l'utilisateur"
my-tech-prior-story [integer!] "priorité technique"
] [
I-O-problem: copy []
object-story: make object! [
my-story-iterations: copy []
date-story: my-date-story
description-story: my-description-story
title-story: my-title-story
estimate-story: my-estimate-story
risk-story: my-risk-story
user-prior-story: my-user-prior-story
tech-prior-story: my-tech-prior-story
tasks-pool: copy []
my-story-state: "iddle"
]
either not attempt
[
id: to-string get-time-stamp
object-project: load-project
append object-project/stories-pool id
append object-project/stories-pool my-title-story
save-project object-project
make-dir/deep %/C/XPDev/objects/object-stories
save-story to-file join id ".o" object-story
return true
]
[
append I-O-problem join "problem with the creation of the story"
return false
]
[
return true
]
]
;creation et addition d'un test
create-add-test: func ["crée une test et les rattache au projet"
;id-story [string!] "identifiant de la story a laquelle le test se rattache"
id-task [string!] "identifiant de la task a laquelle le test se rattache"
my-date-test [date!] "date de création du test"
my-description-test [string!] "description du test"
my-pre-cond-test [string!] "précondition du test"
my-post-cond-test [string!] "postcondition du test"
my-in-test [string!] "Entrées du test"
my-out-test [string!] "Sorties du test"
] [
I-O-problem: copy []
object-test: make object! [
;story-test: id-story
task-test: id-task
date-test: my-date-test
description-test: my-description-test
in-test: my-in-test
out-test: my-out-test
test-state: "iddle"
pre-cond-test: my-pre-cond-test
post-cond-test: my-post-cond-test
]
either not attempt
[
id: to-string get-time-stamp
object-task: load-task id-task
append object-task/task-tests id
save-task to-file join id-task ".o" object-task
make-dir/deep %/C/XPDev/objects/object-tests
save-test to-file join id ".o" object-test
return true
]
[
append I-O-problem join "problem with the creation of the test"
return false
]
[
return true
]
]
;fonctions d'acces au disque
;fonctions load
;chargement de l'url du repository
load-url-repository: func [
"charge l'url dans la série url-repository prévue a cet effet"
] [
either not attempt
[
either not attempt [
url-rep: load %//XPDev/settings/url-rep.s
]
[
change-dir make-dir %//XPDev/settings/
save %url-rep.s "none"
return false
]
[
append repository-url url-rep
return true
]
]
[
append I-O-problem "problem with the repository ... you should check it"
return false
]
[return true]
]
; fonction de chargement de la task
load-test: func [
"retourne l'objet test dont on a passé l'identifiant en paramètre"
id-test [string!] "identifiant du test"
] [
I-O-problem: copy []
either not attempt [
change-dir %/C/xpdev/objects/object-tests/
object-test: do load to-file join id-test ".o"
]
[
append I-O-problem join "problem with the loading of the test" id-test
return false
]
[
return object-test
]
]
load-task: func [
"retourne l'objet task dont on a passé l'identifiant en paramètre"
id-task [string!] "identifiant de la task"
] [
I-O-problem: copy []
either not attempt [
change-dir %/C/xpdev/objects/object-tasks/
object-task: do load to-file join id-task ".o"
]
[
append I-O-problem join "problem with the loading of the task " id-task
return false
]
[
return object-task
]
]
; fonction de chargement de la story
load-story: func [
"retourne l'objet story dont on a passé l'identifiant en paramètre"
id-story [string!] "identifiant de la story"
] [
I-O-problem: copy []
either not attempt [
change-dir %/C/xpdev/objects/object-stories/
object-story: do load to-file join id-story ".o"
]
[
append I-O-problem join "problem with the loading of iteration " id-story
return false
]
[
return object-story
]
]
;fonction de chargement de l'itération
load-iteration: func [
"va rechercher une itération sur le disque et l'instancie"
id-iteration [string!] "identifiant et nom sur le disque de l'iteration"
] [
I-O-problem: copy []
either not attempt [
change-dir %/C/xpdev/objects/object-iterations/
object-iteration: do load to-file join id-iteration ".o"
]
[
append I-O-problem join "problem with the loading of iteration " id-iteration
return false
]
[
return object-iteration
]
]
;fonction de chargement du projet
load-project: func [
"charge le projet"
] [
I-O-problem: copy []
either not attempt [
object-project: do load %/C/xpdev/objects/object-project/object-project.o
]
[
return object-project: create-project
]
[
return object-project
]
]
;fonctions save
;sauvegarde de l'url
save-url-repository: func [
"sauvegarde l'url du repository sur le dd du client"
url-rep [url!] "url du repository"
] [
either not attempt [
save %//XPDev/settings/url-rep.s url-rep
return true
]
[
append I-O-problem "problem with the repository"
return false
]
[
return true
]
]
;fonction de sauvegarde du projet
save-project: func [
"sauve le projet"
object-project [object!] "projet avec toutes les informations"
]
[
I-O-problem: copy []
either not attempt [
either (empty? repository-url) [
change-dir %/C/XPDev/objects/object-project/
save %object-project.o object-project
]
[
where: to-url join repository-url/1 /C /XPDev /objects /object-project /object-project.o
save where object-project
]
return true
]
[
append I-O-problem "probleme a l'enregistrement du projet"
return false
]
[
return true
]
]
;fonction de sauvegarde de l'itération
save-iteration: func [
"sauve une iteration"
name [file!] "nom de l'itération"
iteration [object!] "itération sous forme d'objet avec tout ses renseignement"
] [
I-O-problem: copy []
either not attempt [
either (empty? repository-url) [
change-dir %/C/XPDev/objects/object-iterations
save name iteration
]
[
where: to-url join repository-url/1 [/C /XPDev /objects /object-iterations / name]
save where object-project
]
return true
]
[
append I-O-problem "problem with the saving of the iteration"
return false
]
[
return true
]
]
;fonction de sauvegarde de la story
save-story: func [
"sauve une story sur le disque"
name [file!] "nom de la story sur le disque"
story [object!] "story avec tous ses attributs"
] [
I-O-problem: copy []
either not attempt [
either (empty? repository-url) [
change-dir %/C/XPDev/objects/object-stories
save name story
]
[
where: to-url join repository-url/1 [/C /XPDev /objects /object-stories / name]
save where story
]
return true
]
[
append I-O-problem join "problem with the saving of the story" name
return false
]
[
return true
]
]
;task
save-task: func [
"sauve une task sur le disque"
name [file!] "nom de la story sur le disque"
task [object!] "task a sauver"
] [
I-O-problem: copy []
either not attempt [
either (empty? repository-url) [
change-dir %/C/XPDev/objects/object-tasks
save name task
]
[
where: to-url join repository-url/1 [/C /XPDev /objects /object-tasks / name]
save where task
]
return true
]
[
append I-O-problem join "problem with the saving of the task" name
return false
]
[
return true
]
]
;sauve le test
save-test: func [
"sauve une test sur le disque"
name [file!] "nom de la test sur le disque"
test [object!] "test avec tous ses attributs"
] [
I-O-problem: copy []
either not attempt [
either (empty? repository-url) [
change-dir %/C/XPDev/objects/object-tests
save name test
]
[
where: to-url join repository-url/1 [/C /XPDev /objects /object-tasks / name]
save where task
]
return true
]
[
append I-O-problem join "problem with the saving of the test" name
return false
]
[
return true
]
]
;fonctions qui vont modifier un élément
; projet
launch-project: func [
"lance le projet"
project-name [string!] "nom du projet"
project-description [string!] "texte de la description du projet"
]
[
I-O-problem: copy []
either not attempt [
object-project: load-project
object-project/date: now/date
object-project/names: project-name
object-project/description: project-description
return true
]
[
append I-O-problem "problem with the launching of the project"
return false
]
[
either (save-project object-project)
[
return true
]
[
append I-O-problem "problem with the launching of the project"
return false
]
]
]
;modifie le projet en cours
modify-project-m: func [
"modifie le projet en cours"
project-name [string!] "nom du projet"
project-description [string!] "texte de la description du projet"
project-date [date!] "date de début du projet"
] [
I-O-problem: copy []
either not attempt [
object-project: load-project
object-project/date: project-date
object-project/names: project-name
object-project/description: project-description
return true
]
[
append I-O-problem "problem with the modification of the project"
return false
]
[
either (save-project object-project)
[
return true
]
[
append I-O-problem "problem with the modification of the project"
return false
]
]
]
;modifie une itération
modify-iteration: func [
"modifie des iterations et les rattache au projet"
date-debut [date!] "date de début de l'itération"
date-fin [date!] "date de fin de l'itération"
description [string!] "description de l'itération"
title [string!] "titre de l'itération"
id-iteration [string!] "identifiant de l'itération"
]
[
I-O-problem: copy []
either not attempt
[
object-iteration: load-iteration id-iteration
object-iteration/tit: title
object-iteration/desc: description
object-iteration/date-begining: date-debut
object-iteration/date-end: date-fin
object-project: load-project
object-project/iterations
;changer un élément dans une série a une position donnée
l1: length? object-project/iterations
l2: length? find object-project/iterations id-iteration
pos: l1 - l2 + 2
poke object-project/iterations :pos title
save-project object-project
save-iteration to-file join id-iteration ".o" object-iteration
return true
]
[
append I-O-problem "problem with the modification of the iteration"
return false
]
[
return true
]
]
;story
modify-story: func [
"modifie une story"
my-date-story [string!]
my-description-story [string!] ""
my-title-story [string!] "titre de la story"
my-estimate-story [string!] "difficulté estimée de la story"
my-risk-story [string!] "risque technique de la story"
my-user-prior-story [string!] "priorité utilisateur"
my-tech-prior-story [string!] "priorité technique de la story"
id-story [string!] "identifiant de la story"
] [
I-O-problem: copy []
either not attempt
[
my-date-story: to-date my-date-story
my-estimate-story: to-integer my-estimate-story
my-risk-story: to-integer my-risk-story
my-user-prior-story: to-integer my-user-prior-story
my-tech-prior-story: to-integer my-tech-prior-story
object-story: load-story id-story
object-story/date-story: my-date-story
object-story/description-story: my-description-story
object-story/title-story: my-title-story
object-story/estimate-story: my-estimate-story
object-story/risk-story: my-risk-story
object-story/user-prior-story: my-user-prior-story
object-story/tech-prior-story: my-tech-prior-story
object-project: load-project
;changer un élément dans une série a une position donnée
l1: length? object-project/stories-pool
l2: length? find object-project/stories-pool id-story
pos: l1 - l2 + 2
poke object-project/stories-pool :pos my-title-story
save-project object-project
save-story to-file join id-story ".o" object-story
return true
]
[
return true
]
[
append I-O-problem "problem with the modification of the story"
return false
]
[
return true
]
]
;fonctions qui vont chercher des données dans l'environement
; get-time-stamp
get-time-stamp: func [
"crée un time stamp"
]
[
time-stamp: form now
foreach char ["-" "/" ":" "+"] [time-stamp: replace/all time-stamp char ""]
time-stamp
]
;fonctions qui effacent physiquement des objets
erase-iteration: func [
"efface physiquement l'itération"
id-iteration [string!]
] [
change-dir %/C/xpdev/objects/object-iterations/
delete to-file join %/C/xpdev/objects/object-iterations/ [id-iteration ".o"]
]
erase-story: func [
"efface physiquement la story"
id-story [string!]
] [
change-dir %/C/xpdev/objects/object-stories/
delete to-file join %/C/xpdev/objects/object-stories/ [id-story ".o"]
]
erase-task: func [
"efface physiquement la task"
id-task [string!]
] [
change-dir %/C/xpdev/objects/object-tasks/
delete to-file join %/C/xpdev/objects/object-tasks/ [id-task ".o"]
]
erase-test: func [
"efface physiquement le test"
id-test [string!] "identifiant du test"
] [
change-dir %/C/xpdev/objects/object-tests/
delete to-file join %/C/xpdev/objects/object-tests/ [id-test ".o"]
]
load-url-repository
wrong-fields: copy []
user-logged: copy []
companion: copy []
working-task: copy []
;fonctions verifiant l'existence d'une donnée
;existence de l'utilisateur
check-existence-user: func [
"verfie l'existence d'un user dans le projet en cours"
name [string!] "nom du supposé user"
] [
object-project: load-project
either not attempt
[
find object-project/users name
]
[
return false
]
[
return true
]
]
;existence du nom du projet
check-name-project: func [
"vérifie l'existence du nom du projet en cours"
] [
object-project: load-project
either
(
empty? object-project/names
)
[
return false
]
[
return true
]
]
;validations de groupes de donnees
;validation de l'url
validate-repository: func [
"vérifie si l'url du repository est valide ou non"
url-rep [string!] "url du repository"
] [
url-block: to-block url-rep
test1: empty? url-rep
test2: url? url-block/1
either (test1 or test2)
[
either (empty? url-rep)
[
url-rep: to-url url-rep
save-url-repository url-rep
return true
]
[
url-rep: to-url url-rep
save-url-repository url-rep
return true
]
]
[
append wrong-fields "wrong url"
return false
]
]
;validation d'un test
validate-modified-state-test: func [
"valide la modification d'un etat du test"
id-test [string!] "identifiant du test"
] [
either not attempt [
object-test: load-test id-test
either (object-test/test-state = "iddle")
[object-test/test-state: "done"] ;<<<
[object-test/test-state: "iddle"] ;<<<
save-test to-file join id-test ".o" object-test
return true
]
[return false]
[return true]
]
validate-test: func [
"verifie le validité d' un test"
;id-story [string!] "identifiant de la story a laquelle le test se rattache"
id-task [string!] "identifiant de la task a laquelle le test se rattache"
my-date-test [date!] "date de creation du test"
my-description-test [string!] "description du test"
my-pre-cond-test [string!] "précondition du test"
my-post-cond-test [string!] "postcondition du test"
my-in-test [string!] "Entrées du test"
my-out-test [string!] "Sorties du test"
] [
wrong-fields: copy []
either not attempt
[
if (not validate-date-test my-date-test id-task) [append wrong-fields "date test not correct"]
if (not validate-description-test my-description-test) [append wrong-fields "wrong description"]
if (not validate-my-pre-cond-test my-pre-cond-test) [append wrong-fields "wrong pre-condition"]
if (not validate-my-post-cond-test my-post-cond-test) [append wrong-fields "wrong post-condition"]
if (not validate-my-in-test my-in-test) [append wrong-fields "wrong in"]
if (not validate-my-out-test my-out-test) [append wrong-fields "wrong out"]
either not (empty? wrong-fields)
[return false]
[return true] ;
]
[
return false
]
[
either (
create-add-test id-task my-date-test my-description-test my-pre-cond-test my-post-cond-test my-in-test my-out-test ;<<<
)
[return true]
[
return false]
]
]
;validation d'une task
validate-task: func [
"verifie la validité d' une task"
id-story [string!] "identifiant de la story a laquelle la task se rattache"
my-date-task [date!] "date de début de la task"
my-title-task [string!] "titre de la task"
my-in-task [string!] "variables d'entrées de la task"
my-out-task [string!] "variables de retour de la task"
my-responsabilities-task [string!] "buts de la taches"
my-collaborations-task [string!] "collaborations de la taches"
]
[
wrong-fields: copy []
object-story: load-story id-story
my-story-task: object-story/title-story
either not attempt
[
if (not validate-my-date-task my-date-task id-story) [append wrong-fields "wrong date"]
if (not validate-my-title-task my-title-task) [append wrong-fields "wrong title"]
if (not validate-my-in-task my-in-task) [append wrong-fields "wrong in"]
if (not validate-my-out-task my-out-task) [append wrong-fields "wrong out"]
if (not validate-my-responsabilities-task my-responsabilities-task) [append wrong-fields "wrong responsabilities"]
if (not validate-my-collaborations-task my-collaborations-task) [append wrong-fields "wrong collaborations"]
either (empty? wrong-fields)
[return true]
[return false]
]
[
return false
]
[
either (
create-add-task
id-story
my-date-task
my-title-task
my-story-task
my-in-task
my-out-task
my-responsabilities-task
my-collaborations-task
)
[return true]
[return false]
]
]
;validation d'une story
validate-story: func [
"valide les données d'une itération avant la création"
my-date-story [string!] "date de début de la story"
my-description-story [string!] "description de la story"
my-title-story [string!] "titre de la story"
my-estimate-story [string!] "estimation en points de la story"
my-risk-story [string!] "estimation du programmeur du risque technique"
my-user-prior-story [string!] "priorité de l'utilisateur"
my-tech-prior-story [string!] "priorité technique"
] [
wrong-fields: copy []
either not attempt
[
if (not validate-description-story my-description-story) [append wrong-fields "wrong description"]
if (not validate-title-story my-title-story) [append wrong-fields "wrong title story"]
if (not validate-estimate-story my-estimate-story) [append wrong-fields "wrong estimation"]
if (not validate-risk-story my-risk-story) [append wrong-fields "wrong risk"]
if (not validate-user-prior-story my-user-prior-story) [append wrong-fields "wrong user priority"]
if (not validate-tech-prior-story my-tech-prior-story) [append wrong-fields "wrong technical risk"]
either (empty? wrong-fields)
[return true]
[return false]
]
[
return false
]
[
either (create-add-story to-date my-date-story my-description-story my-title-story to-integer my-estimate-story to-integer my-risk-story to-integer my-user-prior-story to-integer my-tech-prior-story)
[
return true
]
[
return false
]
]
]
;validation d'une story modifiée
validate-modified-story: func [
"verifie la validité d' une story modifiée"
my-date-story [string!] "date de début de la story"
my-description-story [string!] "description de la story"
my-title-story [string!] "titre de la story"
my-estimate-story [string!] "estimation en points de la story"
my-risk-story [string!] "estimation du programmeur du risque technique"
my-user-prior-story [string!] "priorité de l'utilisateur"
my-tech-prior-story [string!] "priorité technique"
id-story [string!] "identifiant de la story"
]
[
wrong-fields: copy []
either not attempt
[
if (not validate-date-story my-date-story) [append wrong-fields "wrong date"]
if (not validate-description-story my-description-story) [append wrong-fields "wrong description"]
if (not validate-title-story my-title-story) [append wrong-fields "wrong title story"]
if (not validate-estimate-story my-estimate-story) [append wrong-fields "wrong estimation"]
if (not validate-risk-story my-risk-story) [append wrong-fields "wrong risk"]
if (not validate-user-prior-story my-user-prior-story) [append wrong-fields "wrong user priority"]
if (not validate-tech-prior-story my-tech-prior-story) [append wrong-fields "wrong technical risk"]
either (empty? wrong-fields)
[return true]
[return false]
]
[
return false
]
[
either (modify-story my-date-story my-description-story my-title-story my-estimate-story my-risk-story my-user-prior-story my-tech-prior-story id-story)
[return true]
[return false]
]
]
; validation d'une iteration
validate-iteration: func [
"verifie la validité d' une iteration"
date-debut [string!] "date de début de l'itération"
date-fin [string!] "date de fin de l'itération"
title [string!] "titre de l'itération"
description [string!] "description de l'itération"
]
[
wrong-fields: copy []
either not attempt
[
if (not validate-date-debut-it date-debut) [append wrong-fields "wrong debut date"]
if (not validate-date-fin-it date-debut date-fin) [append wrong-fields "wrong end date"]
if (not validate-title-it title) [append wrong-fields "wrong title"]
if (not validate-description-it description) [append wrong-fields "wrong description"]
either (empty? wrong-fields)
[return true]
[return false]
]
[
return false
]
[
either (create-add-iteration to-date date-debut to-date date-fin title description)
[return true]
[return false]
]
]
; validation d'une itération modifiée
validate-modified-iteration: func [
"verifie la validité d' une iteration modifiée"
date-debut [string!] "date de début de l'itération"
date-fin [string!] "date de fin de l'itération"
title [string!] "titre de l'itération"
description [string!] "description de l'itération"
id-iteration [string!] "identifiant de l'itération"
]
[
wrong-fields: copy []
either not attempt
[
if (not validate-date-debut-it date-debut) [append wrong-fields "wrong debut date"]
if (not validate-date-fin-it date-debut date-fin) [append wrong-fields "wrong end date"]
if (not validate-title-it title) [append wrong-fields "wrong title"]
if (not validate-description-it description) [append wrong-fields "wrong description"]
either (empty? wrong-fields)
[return true]
[return false]
]
[
return false
]
[
either (modify-iteration to-date date-debut to-date date-fin title description id-iteration)
[return true]
[return false]
]
]
;validation d'un user
validate-user: func [
"verifie la validité d'un user"
user-name [string!] "nom du user"
user-email [string!] "email du user"
]
[
wrong-fields: copy []
I-O-problem: copy []
either not attempt
[
if (not validate-user-name user-name) [append wrong-fields "wrong user name"]
if (not validate-user-email user-email) [append wrong-fields "wrong user email"]
either (empty? wrong-fields)
[return true]
[return false]
]
[
return false
]
[
either (create-add-user user-name to-email user-email)
[return true]
[return false]
]
]
;validation d'un projet
validate-project: func [
"vérifie la validité du projet"
project-name [string!] "nom du projet"
project-description [string!] "texte de la description du projet"
] [
wrong-fields: copy []
either not attempt
[
if (not validate-name-proj project-name) [append wrong-fields "wrong project name"]
if (not validate-desc-proj project-description) [append wrong-fields "wrong description"]
either (empty? wrong-fields)
[return true]
[return false]
]
[
return false
]
[
either (launch-project project-name project-description)
[return true]
[return false]
]
]
;validation d'un projet modifé
validate-project-modified: func [
"valide le projet apres modification"
project-name [string!] "nom du projet"
project-description [string!] "texte de la description du projet"
project-date [date!] "date de début du projet"
] [
wrong-fields: copy []
either not attempt
[
if (not validate-name-proj project-name) [append wrong-fields "wrong project name"]
if (not validate-desc-proj project-description) [append wrong-fields "wrong description"]
either (empty? wrong-fields)
[return true]
[return false]
]
[
return false
]
[
either (modify-project-m project-name project-description project-date)
[
return true
]
[
return false
]
]
]
;validations de champs de formulaires
;validation du test
validate-date-test: func [
"valide la date d'un test"
my-date-task [date!] "date du test"
id-task [string!] "identifiant de la task"
] [
either not attempt
[
object-task: load-task id-task
return [object-task/my-date-task]
]
[
return false
]
[
return true
]
]
validate-description-test: func [
"valide la description d'une test"
my-description-test [string!] "description de la test"
] [
either (not empty? my-description-test)
[
return true
]
[
return false
]
]
validate-my-pre-cond-test: func [
"valide la my-pre-cond d'une test"
my-pre-cond-test [string!] "pre-condition de la test"
] [
either (not empty? my-pre-cond-test)
[
return true
]
[
return false
]
]
validate-my-post-cond-test: func [
"valide la my-post-cond d'une test"
my-post-cond-test [string!] "post-condition de la test"
] [
either (not empty? my-post-cond-test)
[
return true
]
[
return false
]
]
validate-my-in-test: func [
"valide la my-in d'une test"
my-in-test [string!] "inition de la test"
] [
either (not empty? my-in-test)
[
return true
]
[
return false
]
]
validate-my-out-test: func [
"valide la sortie d'un test"
my-out-test [string!] "entree du test"
] [
either (not empty? my-out-test)
[
return true
]
[
return false
]
]
;validation de la task
validate-my-date-task: func [
"valide la date d'une task"
my-date-task [date!] "date de la task"
id-story [string!] "identifiant de la story"
] [
either not attempt
[
object-story: load-story id-story
return [object-story/my-story-date >= my-date-task]
]
[
return false
]
[
return true
]
]
validate-my-title-task: func [
"valide le titre de la story"
my-title-task [string!]
] [
either (not empty? my-title-task)
[
return true
]
[
return false
]
]
validate-my-in-task: func [
"valide les entrées de la task"
my-in-task [string!]
] [
either (not empty? my-in-task)
[
return true
]
[
return false
]
]
validate-my-out-task: func [
"valide les entrées de la task"
my-out-task [string!]
] [
either (not empty? my-out-task)
[
return true
]
[
return false
]
]
validate-my-responsabilities-task: func [
"valide les entrées de la task"
my-responsabilities-task [string!]
] [
either (not empty? my-responsabilities-task)
[
return true
]
[
return false
]
]
validate-my-collaborations-task: func [
"valide les entrées de la task"
my-collaborations-task [string!]
] [
either (not empty? my-collaborations-task)
[
return true
]
[
return false
]
]
;validation du nom du binome
validate-companion: func [
"verifie la validité d'un binome"
companion-name [string!] "nom du binome"
] [
object-project: load-project
either not attempt
[
either (empty? companion-name)
[
return true
]
[
either (find object-project/users companion-name)
[
return true
]
[
return false
]
]
]
[
return false
]
[
return true
]
]
;validation du nom de login
validate-user-name: func [
"verifie la validité du nom du user"
user-name [string!]
]
[
object-project: load-project
either not attempt
[
either (empty? user-name)
[
return false
]
[
either (find object-project/users user-name)
[
return false
]
[
return true
]
]
]
[
return false
]
[
return true
]
]
validate-user-email: func [
"vérifie la validité du email du user"
email-user [string!]
]
[
either not attempt
[
test: email? first to-block email-user
]
[
return false
]
[
return true
]
]
;validation du formulaire de creation de l'iteration
validate-date-debut-it: func [
"vérifie la validité de la date de début de l'itération"
date-debut [string!] "date de début de l'itération"
]
[
either not attempt [date: to-date date-debut]
[
return false
]
[
return true
]
]
validate-date-fin-it: func [
"validation de la date de fin de l'itération"
date-debut [string!] "date de début de l'itération"
date-fin [string!] "date de fin de l'itération"
]
[
either not attempt [
date-debut: to-date date-debut
date-fin: to-date date-fin
]
[
return false
]
[
either (positive? res: date-fin - date-debut)
[return true]
[return false]
]
]
validate-description-it: func [
"vérifie la validité de la description de l'iteration"
description [string!] "description de l'itération"
]
[
either (not empty? description)
[
return true
]
[
return false
]
]
validate-title-it: func [
"vérifie la validité du titre de l'iteration"
title [string!] "titre de l'itération"
]
[
either (not empty? title)
[
return true
]
[
return false
]
]
;validation formulaire de creation du projet
validate-name-proj: func [
"verifie la validité du nom du projet"
project-name [string!] "nom du projet"
] [
either (empty? project-name)
[return false]
[return true]
]
validate-desc-proj: func [
"verifie la validité de la description du projet"
project-desc [string!] "description du projet"
] [
either (empty? project-desc)
[return false]
[return true]
]
;validation du formulaire de story
; description de la story
validate-description-story: func [
"valide la description d'une story"
my-description-story [string!] "description de la story"
] [
either (not empty? my-description-story)
[
return true
]
[
return false
]
]
;titre de la story
validate-title-story: func [
"valide le titre d'une story"
my-title-story [string!] "titre de la story"
] [
either (not empty? my-title-story)
[
return true
]
[
return false
]
]
;estimation de la story
validate-estimate-story: func [
"valide l'estimation de la story"
my-estimate-story [string!] "l'estimation de la story"
] [
either (not to-logic attempt [to-integer my-estimate-story])
[
return false
]
[
return true
]
]
;risque de la story
validate-risk-story: func [
"valide le risque technique de la story"
my-risk-story [string!] "le risque de la story"
] [
either (not to-logic attempt [to-integer my-risk-story])
[
return false
]
[
return true
]
]
;priorité utilisateur
validate-user-prior-story: func [
"valide la priorité utilisateur de la story"
my-user-prior-story [string!] "la priorité utilisateur de la story"
] [
either (not to-logic attempt [to-integer my-user-prior-story])
[
return false
]
[
return true
]
]
;priorité technique
validate-tech-prior-story: func [
"valide la priorité technique de la story"
my-tech-prior-story [string!] "la priorité technique de la story"
] [
either (not to-logic attempt [to-integer my-tech-prior-story])
[
return false
]
[
return true
]
]
;date de la story
validate-date-story: func [
"valide la date de la story"
my-date-story [string!] "date de la story"
] [
either (not to-logic attempt [to-date my-date-story])
[
return false
]
[
return true
]
]
;fonction récupérant une donnée et la renvoyant vers la vue (get)
get-name-user: func [
"retourne le nom du user"
] [
return first user-logged
]
;donnée de user
get-email-user: func [
"fonction retournant le mail du user"
name-user [string!] "nom du user"
]
[
object-project: load-project
either (email? info: first pick find object-project/users name-user 2)
[
info: to-string info
]
[
info: ""
]
return info
]
;données de project
;1st story
get-first-story: func [
"retourne l'identifiant de la première itération"
] [
either not attempt
[
object-project: load-project
]
[
foreach el I-O-problem [alert el]
return ""
]
[
return to-string test: object-project/stories-pool/1
]
]
;1st iteration
get-first-iteration: func [
"retourne l'identifiant de la première itération"
] [
either not attempt
[
object-project: load-project
]
[
foreach el I-O-problem [alert el]
return ""
]
[
return to-string test: object-project/iterations/1
]
]
;nom
get-project-name: func [
"retourne le nom du projet"
] [
object-project: load-project
return object-project/names
]
;date de création
get-project-date: func ["retourne la date de création du projet"] [
object-project: load-project
return to-string object-project/date
]
;description
get-project-description: func ["retourne la description du projet"] [
object-project: load-project
return object-project/description
]
;calcul de l'état du projet
get-state-project: func [
"calcule l'état du projet"
] [
either not attempt
[
object-project: load-project
if (object-project = false) [return false]
undone-i: 0
done-i: 0
iteration-serie: object-project/iterations
forskip iteration-serie 2
[
object-iteration: load-iteration iteration-serie/1
either (object-iteration/state = "done")
[done-i: done-i + 1]
[undone-i: undone-i + 1]
]
state: join 100 * (done-i / (undone-i + done-i)) " %"
return true
]
[
return "0 %"
]
[
return state
]
]
;etat en numérique
get-state-project-numeric: func [
"calcule l'état d'une itération dont on passe l'identifiant en paramètre"
] [
either not attempt
[
object-project: load-project
if (object-project = false) [return false]
undone-i: 0
done-i: 0
iteration-serie: object-project/iterations
forskip iteration-serie 2
[
object-iteration: load-iteration iteration-serie/1
either (object-iteration/state = "done")
[done-i: done-i + 1]
[undone-i: undone-i + 1]
]
state: (done-i / (undone-i + done-i))
return true
]
[
return 0
]
[
return state
]
]
;données d'iteration
get-iteration-name: func [
"retourne le nom de l'itération dont l'identifiant a été passé en paramètre ou une chaine vide si échec"
id-iteration [string!] "identifiant de l'itération"
] [
either not attempt [
object-iteration: load-iteration id-iteration
either (object-iteration = false)
[return false]
[return true]
]
[
return ""
]
[
return object-iteration/tit
]
]
get-iteration-description: func [
"recherche la description d'une itération ou une chaine vide si l'id est invalide"
id-iteration [string!] "identifiant de l'itération"
]
[
either not attempt
[
object-iteration: load-iteration id-iteration
either (object-iteration = false)
[return false]
[return true]
]
[
return ""
]
[
return object-iteration/desc
]
]
get-iteration-end: func [
"retourne la date de fin de l'itération dont l'identifiant a été passé en paramètre ou une chaine vide si échec"
id-iteration [string!] "identifiant de l'itération"
] [
either not attempt [
object-iteration: load-iteration id-iteration
either (object-iteration = false)
[return false]
[return true]
]
[
return ""
]
[
return object-iteration/date-end
]
]
get-iteration-begining: func [
"retourne la date de début de l'itération dont l'identifiant a été passé en paramètre ou une chaine vide si échec"
id-iteration [string!] "identifiant de l'itération"
] [
id-iteration
either not attempt [
object-iteration: load-iteration id-iteration
either (object-iteration = false)
[return false]
[return true]
]
[
return ""
]
[
return object-iteration/date-begining
]
]
get-state-iteration-numeric: func [
"calcule l'état d'une itération dont on passe l'identifiant en paramètre"
id-iteration [string!] "identifiant de l'itération"
] [
either not attempt
[
object-iteration: load-iteration id-iteration
if (object-iteration = false) [return false]
story-serie: object-iteration/stories-iteration
forskip story-serie 2
[
get-state-story-numeric story-serie/1
]
undone: 0
done: 0
forskip story-serie 2
[
object-story: load-story story-serie/1
either (object-story/my-story-state = "done")
[done: done + 1]
[undone: undone + 1]
]
state: (done / (undone + done))
return true
]
[
return 0
]
[
return state
]
]
get-state-iteration: func [
"calcule l'état d'une itération dont on passe l'identifiant en paramètre"
id-iteration [string!] "identifiant de l'itération"
] [
either not attempt
[
object-iteration: load-iteration id-iteration
story-serie: object-iteration/stories-iteration
if (object-iteration = false) [return false]
forskip story-serie 2
[
get-state-story-numeric story-serie/1
]
undone: 0
done: 0
forskip story-serie 2
[
story-serie
object-story: load-story story-serie/1
either (object-story/my-story-state = "done")
[done: done + 1]
[undone: undone + 1]
]
state: join 100 * (done / (undone + done)) " %"
either (state = "100 %")
[
object-iteration/state: "done"
]
[
object-iteration/state: "iddle"
]
save-iteration to-file join id-iteration ".o" object-iteration
return true
]
[
return "0 %"
]
[
return state
]
]
;données de la story
;état en numérique
get-state-story-numeric: func [
"retourne l'état de la story en numérique"
id-story [string!]
] [
wrong-fields: copy []
either not attempt
[
object-story: load-story id-story
if (object-story = false) [return 0]
tasks-serie: object-story/tasks-pool
forskip tasks-serie 2 [get-state-task-numeric tasks-serie/1]
undone: 0
done: 0
forskip tasks-serie 2
[
object-task: load-task tasks-serie/1
either (object-task/task-state = "done")
[done: done + 1]
[undone: undone + 1]
]
state: (done / (undone + done))
either (state = 1)
[
object-story/my-story-state: "done"
]
[
object-story/my-story-state: "iddle"
]
save-story to-file join id-story ".o" object-story
return true
]
[
return 0
]
[
return state
]
]
;etat sous forme de chaine de caractère
get-state-story: func [
"retourne l'état de la story en numérique"
id-story [string!]
] [
wrong-fields: copy []
either not attempt
[
object-story: load-story id-story
if (object-story = false) [return 0]
undone: 0
done: 0
tasks-serie: object-story/tasks-pool
forskip tasks-serie 2
[
object-task: load-task tasks-serie/1
either (object-task/task-state = "done")
[done: done + 1]
[undone: undone + 1]
]
state: 100 * (done / (undone + done))
if (state = 1) [
object-story/my-story-state: "done"
save-story to-file join id-story ".o" object-story
]
return true
]
[
return "0 %"
]
[
return join state "%"
]
]
;titre
get-story-title: func [
"retourne le titre de la story ou une chaine vide si échec"
id-story [string!]
] [
either not attempt [
object-story: load-story id-story
either (object-story = false)
[return false]
[return true]
]
[
return ""
]
[
return object-story/title-story
]
]
;date
get-story-date: func [
"retourne la date de creation de la story ou une chaine vide si échec"
id-story [string!]
] [
either not attempt [
object-story: load-story id-story
either (object-story = false)
[return false]
[return true]
]
[
return ""
]
[
return object-story/date-story
]
]
;estimation
get-story-estimate: func [
"retourne l'estimation de la story ou une chaine vide si échec"
id-story [string!]
] [
either not attempt [
object-story: load-story id-story
either (object-story = false)
[return false]
[return true]
]
[
return ""
]
[
return to-string object-story/estimate-story
]
]
;description
get-story-description: func [
"retourne la description de la story ou une chaine vide si échec"
id-story [string!]
] [
either not attempt [
object-story: load-story id-story
either (object-story = false)
[return false]
[return true]
]
[
return ""
]
[
return to-string object-story/description-story
]
]
;risque
get-story-tech-risk: func [
"retourne le risque technique de la story ou une chaine vide si échec"
id-story [string!]
] [
either not attempt [
object-story: load-story id-story
either (object-story = false)
[return false]
[return true]
]
[
return ""
]
[
return to-string object-story/risk-story
]
]
;priorité technique
get-story-tech-priority: func [
"retourne la priorité technique de la story ou une chaine vide si échec"
id-story [string!]
] [
either not attempt [
object-story: load-story id-story
either (object-story = false)
[return false]
[return true]
]
[
return ""
]
[
return to-string object-story/tech-prior-story
]
]
;priorité utilisateur
get-story-user-priority: func [
"retourne la priorité utilisateur de la story ou une chaine vide si échec"
id-story [string!]
] [
either not attempt [
object-story: load-story id-story
either (object-story = false)
[return false]
[return true]
]
[
return ""
]
[
return to-string object-story/user-prior-story
]
]
;données de la task
;date
get-date-task: func [
"retourne la date de la task"
id-task [string!] "identifiant de la task"
] [
either not attempt [
object-task: load-task id-task
retour: to-string object-task/date-task
return true
]
[
return ""
]
[
return retour
]
]
;title
get-title-task: func [
"retourne le titre de la task"
id-task [string!] "identifiant de la task"
] [
either not attempt [
object-task: load-task id-task
retour: to-string object-task/title-task
return true
]
[
return ""
]
[
return retour
]
]
;story
get-story-task: func [
"retourne le story de la task"
id-task [string!] "identifiant de la task"
] [
either not attempt [
object-task: load-task id-task
retour: to-string object-task/story-task
return true
]
[
return ""
]
[
return retour
]
]
; entrées
get-in-task: func [
"retourne les entrées de la task"
id-task [string!] "identifiant de la task"
] [
either not attempt [
object-task: load-task id-task
retour: object-task/in-task
return true
]
[
return ""
]
[
return retour
]
]
;state
get-state-task: func [
"calcule l'état d'une task dont on passe l'identifiant en paramètre"
id-task [string!] "identifiant de la task"
]
[
either not attempt
[
object-task: load-task id-task
if (object-task = false) [return "0 %"]
undone: 0
done: 0
tests-serie: object-task/task-tests
foreach el tests-serie
[
object-test: load-test el
either (object-test/test-state = "done")
[done: done + 1]
[undone: undone + 1]
]
state: join 100 * (done / (done + undone)) " %"
return true
]
[
return "0%"
]
[
return state
]
]
;state-numeric
get-state-task-numeric: func [
"retourne l'état de la task en numérique"
id-task [string!]
] [
wrong-fields: copy []
either not attempt
[
object-task: load-task id-task
if (object-task = false) [return 0]
undone: 0
done: 0
tests-serie: object-task/task-tests
foreach el tests-serie
[
object-test: load-test el
either (object-test/test-state = "done")
[done: done + 1]
[undone: undone + 1]
]
state: (done / (undone + done))
either (state = 1)
[
object-task/task-state: "done"
]
[
object-task/task-state: "iddle"
]
object-task/task-state
save-task to-file join id-task ".o" object-task
return true
]
[
return 0
]
[
return state
]
]
; sorties
get-out-task: func [
"retourne les entrées de la task"
id-task [string!] "identifiant de la task"
] [
either not attempt [
object-task: load-task id-task
retour: object-task/out-task
return true
]
[
return ""
]
[
return retour
]
]
;responsabilities
get-responsabilities-task: func [
"retourne les entrées de la task"
id-task [string!] "identifiant de la task"
] [
either not attempt [
object-task: load-task id-task
retour: object-task/responsabilities-task
return true
]
[
return ""
]
[
return retour
]
]
;collaborations
get-collaborations-task: func [
"retourne les entrées de la task"
id-task [string!] "identifiant de la task"
] [
either not attempt [
object-task: load-task id-task
retour: to-string object-task/collaborations-task
return true
]
[
return ""
]
[
return retour
]
]
;donnée du test
get-task-test: func [
"retourne la task qui contient le test ou une chaine vide si échec"
id-test [string!]
] [
either not attempt [
object-test: load-test id-test
either (object-test = false)
[return false]
[return true]
]
[
return ""
]
[
return object-test/task-test
]
]
get-in-test: func [
"retourne les entrées du test"
id-test [string!] "identifiant du test"
] [
either not attempt [
object-test: load-test id-test
retour: object-test/in-test
return true
]
[
return ""
]
[
return retour
]
]
get-out-test: func [
"retourne les sorties du test"
id-test [string!] "identifiant du test"
] [
either not attempt [
object-test: load-test id-test
retour: object-test/out-test
return true
]
[
return ""
]
[
return retour
]
]
get-summary-test: func [
"retourne la description du test"
id-test [string!] "identifiant du test"
] [
either not attempt [
object-test: load-test id-test
retour: object-test/description-test
return true
]
[
return ""
]
[
return retour
]
]
get-story-test: func [
"retourne la story du test"
id-test [string!] "identifiant du test"
] [
either not attempt [
object-test: load-test id-test
retour: object-test/story-test
return true
]
[
return ""
]
[
return retour
]
]
get-date-test: func [
"retourne la date de création du test"
id-test [string!] "identifiant du test"
] [
either not attempt [
object-test: load-test id-test
retour: object-test/date-test
return true
]
[
return ""
]
[
return retour
]
]
get-state-test: func [
"retourne l'état de création du test"
id-test [string!] "identifiant du test"
] [
either not attempt [
object-test: load-test id-test
retour: object-test/test-state
return true
]
[
return ""
]
[
return retour
]
]
get-pre-cond-test: func [
"retourne la précondition du test ou une chaine vide si échec"
id-test [string!]
] [
either not attempt [
object-test: load-test id-test
either (object-test = false)
[return false]
[return true]
]
[
return ""
]
[
return object-test/pre-cond-test
]
]
get-post-cond-test: func [
"retourne la postcondition du test ou une chaine vide si échec"
id-test [string!]
] [
either not attempt [
object-test: load-test id-test
either (object-test = false)
[return false]
[return true]
]
[
return ""
]
[
return object-test/pre-cond-test
]
]
;fonction qui vont mettre une donnée dans une série (set) en attente d'etre récupérée pour la vue
set-name-user: func [
"initialise le user logged"
name [string!] "nom de l'utilisateur venant de se logguer"
]
[
either not attempt
[
append user-logged name
return true
]
[
return false
]
[
return true
]
]
;fonctions qui suppriment quelque chose
;iteration
delete-iteration: func [
"détruit une itération sur le disque"
id-iteration-di [string!] "identifiant de l'itération"
] [
either not attempt [
object-project: load-project
serie-it-di: object-project/iterations
l1: length? serie-it-di
l2: length? test: find serie-it-di id-iteration-di
val1: l1 - l2 + 1
val2: val1 + 1
poke serie-it-di val1 69
poke serie-it-di val2 69
remove-each el serie-it-di [el = 69]
object-project/iterations: copy serie-it-di
save-project object-project
erase-iteration id-iteration-di
return true
]
[
append I-O-problem join "problem with the destruction of iteration " id-iteration-di
return false
]
[
return true
]
]
; story
delete-story: func [
"détruit une itération sur le disque"
id-story [string!] "identifiant de la story"
] [
either not attempt [
object-project: load-project
serie-st-di: object-project/stories-pool
l1: length? serie-st-di
l2: length? test: find serie-st-di id-story
val1: l1 - l2 + 1
val2: val1 + 1
poke serie-st-di val1 69
poke serie-st-di val2 69
remove-each el serie-st-di [el = 69]
object-project/stories-pool: copy serie-st-di
save-project object-project
erase-story id-story
return true
]
[
append I-O-problem join "problem with the destruction of story " id-story
return false
]
[
return true
]
]
;check
check-companion: func [
"vérifie si le binome est dans le projet"
name-companion [string!] "nom du binome"
] [
either not attempt
[
either (not empty? name-companion)
[
object-project: load-project
find object-project/users name-companion
return true
]
[
name-companion: "alone"
return true
]
]
[return false]
[return true]
]
;task
delete-task: func [
"détruit une itération sur le disque"
id-task [string!] "identifiant de la task"
] [
I-O-problem: copy []
either not attempt [
object-task: load-task id-task
object-story: load-story object-task/story-task/1
serie-st-di: object-story/tasks-pool
l1: length? serie-st-di
l2: length? test: find serie-st-di id-task
val1: l1 - l2 + 1
val2: val1 + 1
poke serie-st-di val1 69
poke serie-st-di val2 69
remove-each el serie-st-di [el = 69]
object-story/tasks-pool: copy serie-st-di
save-story to-file join object-task/story-task/1 ".o" object-story
erase-task id-task
return true
]
[
append I-O-problem join "problem with the destruction of task " id-task
return false
]
[
return true
]
]
delete-test: func [
"détruit un test sur le disque"
id-test [string!] "identifiant du test"
] [
I-O-problem: copy []
either not attempt [
object-test: load-test id-test
object-task: load-task object-test/task-test
serie-st-di: object-task/task-tests
l1: length? serie-st-di
l2: length? test: find serie-st-di id-test
val1: l1 - l2 + 1
poke serie-st-di val1 69
remove-each el serie-st-di [el = 69]
object-task/task-tests: copy serie-st-di
save-task to-file join object-test/task-test ".o" object-task
erase-test id-test
return true
]
[
append I-O-problem join "problem with the destruction of test " id-test
return false
]
[
return true
]
]
;fonctions qui lient des éléments
;story-iteration
add-story-iteration: func [
"ajoute une story dans une itération"
id-story [string!] "identifiant de la story"
id-iteration [string!] "identifiant de l'itération"
] [
either not attempt [
wrong-fields: copy []
object-iteration: load-iteration id-iteration
object-story: load-story id-story
either not attempt [find object-iteration/stories-iteration id-story]
[
append object-iteration/stories-iteration id-story
append object-iteration/stories-iteration object-story/title-story
append object-story/my-story-iterations id-iteration
save-story to-file join id-story ".o" object-story
save-iteration to-file join id-iteration ".o" object-iteration
return true
]
[
return false
]
]
[
append wrong-fields "problem with the link of the story and the iteration"
return false
]
[
return true
]
]
take-task: func [
"prendre la task et inscrire le user logged dans le log qui l'a prise, son binome et l'heure"
id-task [string!]
]
[
either not attempt [
object-task: load-task id-task
either (empty? object-task/log) and (empty? working-task)
[
append object-task/log user-logged/1
append object-task/log companion/1
append object-task/log now/time
append working-task id-task
save-task to-file join id-task ".o" object-task
]
[
return false
]
]
[return false]
[return true]
]
leave-task-prod-code: func [
"mettre le journal en ordre stable et cloturer la task"
]
[
either not attempt [
object-task: load-task working-task/1
time-elapsed: object-task/log/3 - now/time
append object-task/log time-elapsed
save-task to-file join working-task/1 ".o" object-task
working-task: copy []
return true
]
[return false]
[return true]
]
leave-task-spikes: func [
"mettre a blanc le log"
]
[
either not attempt [
object-task: load-task working-task/1
object-task/log: copy []
save-task to-file join working-task/1 ".o" object-task
working-task: copy []
return true
]
[return false]
[return true]
]
;feuille de style
general-styles: stylize
[
;styles de textes
my-title-text: text underline black font-size 16
my-text: text black font-size 16
my-big-text: text black font-size 32
my-red-text: text red font-size 16
;styles d'aires de texte
my-area: area 350x50
my-area-task: area 150x40
;styles de labels
my-title-label: label black font-size 16
my-big-label: label black font-size 20
my-label: label black
my-label-task: label black 40x20
;styles de fields
my-field: field ivory
my-field-task: field ivory 150x20
my-field-small: field ivory 80x20
my-field-date: field ivory 70x20
my-field-number: field ivory 30x20
;styles de controles
my-button: button ivory
;mes styles d'info
my-info-date: info ivory 70x20
my-info: info ivory
my-info-number: info ivory 30x20
my-info-area: info ivory 350x50
;style de progress bar
my-progress: progress green blue 100x20
]
;fonction qui génère des layouts
simple-layout-generator: func [
"génère les écrans en utilisant accross, below, return et tab"
sty [logic!] "paramètre permettant la présence ou non de la feuille de style"
fond [tuple!] "tuple contenant la couleur de fond du layout"
taille [pair!] "taille du layout"
elements [block!] "elements du layout"
] [
fen: copy []
if (sty) [append fen compose [styles general-styles]]
append fen reduce ['size taille]
append fen reduce ['backdrop fond]
foreach component elements [
append fen component/1
;structure d'un bloc: nom [string!] type [style!] contenu [string!] fonction [block!] ou bien return
foreach el component/2 [
either (string? el)
[append fen to-word el]
[
append fen to-set-word el/1
append fen el/2
append fen el/3
append fen reduce [either (block? el/4) [el/4] [""]]
]
]
]
]
;fenetre principale
main-layout: func [
"génère l'écran qui supporte les autres"
] [
;fonctions générant des layouts de forums venant se greffer sur la fenetre principale
;forum d'iteration
forum-iteration: func [
"cree un layout qui gère les pages d'itérations a la manière d'un forum"
page-vis [integer!] "numéro de la page qui doit etre visible"
] [
use [] [
forum-iteration-layout: copy []
forum-iteration-layout: copy [
size 500x225
backdrop ivory
across
at 50x2 label black "iterations"
at 0x50 boite: box ivory 500x200
do [
boite/pane: layout/offset/origin management-page-iteration-layout page-vis serie-iter 0x0 0x0
]
at 5x25
]
object-project: load-project
serie-iter: object-project/iterations
;calcul du nombre de pages
nb-pages: round/ceiling / length? serie-iter 10
for i 1 nb-pages 1
[
append forum-iteration-layout compose/deep [text blue (to-string i) [boite/pane: layout/offset/origin management-page-iteration-layout (i) serie-iter 0x0 0x0 show boite]]
]
]
return forum-iteration-layout
]
;forum-story
forum-story: func [
"cree un layout qui gère les pages de story a la manière d'un forum"
page-vis [integer!] "numéro de la page qui doit etre visible"
] [
forum-story-layout: copy []
forum-story-layout: copy [
size 500x225
backdrop ivory
across
at 50x2 label black "Stories"
at 0x50 boite: box ivory 500x200
do [
boite/pane: layout/offset/origin management-page-stories-layout page-vis serie-stories 0x0 0x0
]
at 5x25
]
object-project: load-project
serie-stories: object-project/stories-pool
;calcul du nombre de pages
nb-pages: round/ceiling / length? serie-stories 10
for i 1 nb-pages 1
[
append forum-story-layout compose/deep [text blue (to-string i) [boite/pane: layout/offset/origin management-page-stories-layout (i) serie-stories 0x0 0x0 show boite]]
]
return forum-story-layout
]
forum-story-add: func [
"cree un layout qui gère les pages de story a la manière d'un forum"
page-vis [integer!] "numéro de la page qui doit etre visible"
id-iteration [string!] "identifiant de l'itération a laquelle on peut rattacher la story"
] [
forum-story-layout: copy []
forum-story-layout: copy [
size 500x225
backdrop ivory
across
at 50x2 label black "Stories"
at 0x50 boite: box ivory 500x200
do [
boite/pane: layout/offset/origin management-page-stories-add-layout page-vis serie-stories id-iteration 0x0 0x0
]
at 5x25
]
object-project: load-project
serie-stories: object-project/stories-pool
;calcul du nombre de pages
nb-pages: round/ceiling / length? serie-stories 10
for i 1 nb-pages 1
[
append forum-story-layout compose/deep [text blue (to-string i) [boite/pane: layout/offset/origin management-page-stories-add-layout (i) serie-stories id-iteration 0x0 0x0 show boite]]
]
return forum-story-layout
]
forum-story-iteration: func [
"cree un layout qui gère les pages de story rattachée a une iteration a la manière d'un forum"
id-iteration [string!] "identifiant de l'itération"
page-vis [integer!] "numéro de la page qui doit etre visible"
] [
forum-story-layout: copy []
forum-story-layout: copy [
size 500x225
backdrop ivory
across
at 50x2 label black "Stories"
at 0x50 boite: box ivory 500x200
do [
boite/pane: layout/offset/origin management-page-stories-layout page-vis serie-stories 0x0 0x0
]
at 5x25
]
object-iteration: load-iteration id-iteration
serie-stories: object-iteration/stories-iteration
;calcul du nombre de pages
nb-pages: round/ceiling / length? serie-stories 10
for i 1 nb-pages 1
[
append forum-story-layout compose/deep [text blue (to-string i) [boite/pane: layout/offset/origin management-page-stories-layout (i) serie-stories 0x0 0x0 show boite]]
]
return forum-story-layout
]
;forum de tasks
forum-task: func [
"présente les tasks comme dans un forum"
id-story [string!] "identifiant de la story a laquelle sont rattachées les tasks"
page-vis [integer!] "numéro de la page qui doit etre visible"
] [
forum-tasks-layout: copy [
size 500x225
backdrop ivory
across
at 50x2 label black "Tasks"
at 0x50 boite: box ivory 500x200
do [
boite/pane: layout/offset/origin management-page-tasks-layout page-vis serie-tasks 0x0 0x0
]
at 5x25
]
object-story: load-story id-story
serie-tasks: object-story/tasks-pool
;calcul du nombre de pages
nb-pages: round/ceiling / length? serie-tasks 10
for i 1 nb-pages 1
[
append forum-tasks-layout compose/deep [text blue (to-string i) [boite/pane: layout/offset/origin management-page-tasks-layout (i) serie-tasks 0x0 0x0 show boite]]
]
return forum-tasks-layout
]
; forum de tests
forum-test: func [
"présente les tests comme dans un forum"
id-task [string!] "identifiant de la task a laquelle sont rattachées les tests"
page-vis [integer!] "numéro de la page qui doit etre visible"
] [
forum-tests-layout: copy [
size 500x225
backdrop ivory
across
at 50x2 label black "Tests"
at 0x50 boite: box ivory 500x200
do [
boite/pane: layout/offset/origin management-page-tests-layout page-vis serie-tests 0x0 0x0
]
at 5x25
]
object-task: load-task id-task
serie-tests: object-task/task-tests
;calcul du nombre de pages
nb-pages: round/ceiling / length? serie-tests 10
for i 1 nb-pages 1
[
append forum-tests-layout compose/deep [text blue (to-string i) [boite/pane: layout/offset/origin management-page-tests-layout (i) serie-tests 0x0 0x0 show boite]]
]
return forum-tests-layout
]
;forum de test
forum-test-working: func [
"présente les tests comme dans un forum"
id-task [string!] "identifiant de la task a laquelle sont rattachées les tests"
page-vis [integer!] "numéro de la page qui doit etre visible"
] [
forum-tests-layout: copy [
size 500x225
backdrop ivory
across
at 50x2 label black "Tests"
at 0x50 boite: box ivory 500x200
do [
boite/pane: layout/offset/origin management-page-tests-taken-layout page-vis serie-tests 0x0 0x0
]
at 5x25
]
object-task: load-task id-task
serie-tests: object-task/task-tests
;calcul du nombre de pages
nb-pages: round/ceiling / length? serie-tests 10
for i 1 nb-pages 1
[
append forum-tests-layout compose/deep [text blue (to-string i) [boite/pane: layout/offset/origin management-page-tests-layout (i) serie-tests 0x0 0x0 show boite]]
]
return forum-tests-layout
]
;fonctions qui produisent des pages de management
;fonction qui produit une page de management d'iteration
management-page-iteration-layout: func [
"cree un bloc de layout de page de 5 lignes"
num-page [integer!] "numéro de la page"
serie-object [block!] "serie a paginer"
] [
page: copy [backdrop ivory size 500x200 tab across]
num-prem-ligne: (10 * (num-page - 1)) + 1
serie-it: at serie-object num-prem-ligne
for i 1 10 2
[
j: i + 1
id-object: to-string serie-it/:i
name-object: to-string serie-it/:j
either (not id-object = "none") [append page compose/deep management-line-iteration-layout id-object name-object] [append page compose []]
]
return page
]
;fonction qui produit une page de management de story
management-page-stories-layout: func [
"cree un bloc de layout de page de 5 lignes"
num-page [integer!] "numéro de la page"
serie-object [block!] "serie a paginer"
] [
page: copy [backdrop ivory size 500x200 tab across]
num-prem-ligne: (10 * (num-page - 1)) + 1
serie-it: at serie-object num-prem-ligne
for i 1 10 2
[
j: i + 1
id-object: to-string serie-it/:i
name-object: to-string serie-it/:j
either (not id-object = "none") [append page compose/deep management-line-story-layout id-object name-object] [append page compose []]
]
return page
]
management-page-stories-add-layout: func [
"cree un bloc de layout de page de 5 lignes qui permet l'ajout d'une story a une itération"
num-page [integer!] "numéro de la page"
serie-object [block!] "serie a paginer"
id-iteration [string!] "identifiant de l'itération"
] [
page: copy [backdrop ivory size 500x200 tab across]
num-prem-ligne: (10 * (num-page - 1)) + 1
serie-it: at serie-object num-prem-ligne
for i 1 10 2
[
j: i + 1
id-object: to-string serie-it/:i
name-object: to-string serie-it/:j
either (not id-object = "none") [append page compose/deep management-line-story-add-layout id-object name-object id-iteration] [append page compose []]
]
return page
]
;tasks-management
management-page-tasks-layout: func [
"cree un bloc de layout de page de 5 lignes"
num-page [integer!] "numéro de la page"
serie-object [block!] "serie a paginer"
] [
page: copy [backdrop ivory size 500x200 tab across]
num-prem-ligne: (10 * (num-page - 1)) + 1
serie-it: at serie-object num-prem-ligne
for i 1 10 2
[
j: i + 1
id-object: to-string serie-it/:i
name-object: to-string serie-it/:j
either (not id-object = "none") [append page compose/deep management-line-tasks-layout id-object name-object] [append page compose []]
]
return page
]
management-page-tests-layout: func [
"cree un bloc de layout de page de 5 lignes"
num-page [integer!] "numéro de la page"
serie-object [block!] "serie a paginer"
] [
page: copy [backdrop ivory size 500x200 tab across]
num-prem-ligne: (10 * (num-page - 1)) + 1
serie-it: at serie-object num-prem-ligne
for i 1 5 1
[
j: i + 1
id-object: to-string serie-it/:i
name-object: to-string serie-it/:j
either (not id-object = "none") [append page compose/deep management-line-tests-layout id-object name-object] [append page compose []]
]
return page
]
management-page-tests-taken-layout: func [
"cree un bloc de layout de page de 5 lignes"
num-page [integer!] "numéro de la page"
serie-object [block!] "serie a paginer"
] [
page: copy [backdrop ivory size 500x200 tab across]
num-prem-ligne: (10 * (num-page - 1)) + 1
serie-it: at serie-object num-prem-ligne
for i 1 5 1
[
j: i + 1
id-object: to-string serie-it/:i
name-object: to-string serie-it/:j
either (not id-object = "none") [append page compose/deep management-line-tests-taken-layout id-object name-object] [append page compose []]
]
return page
]
;fonctions qui produit une ligne de page de management d'iteration
management-line-iteration-layout: func [
"cree une ligne de layout pour une page"
id-iteration [string!] "identifiant d'une iteration"
name-iteration [string!] "nom d'une iteration"
] [
use [line]
[
line: copy []
append line compose/deep
[
name-obj-f-l: text (name-iteration) 80x25 [
lay: iteration-presentation (id-iteration)
mid/pane: layout/offset/origin lay 0x0 5x5
show mid
end/pane: layout/offset/origin forum-story-iteration (id-iteration) 1 0x0 5x5
show end
]
tab
btn-mod-f-l: btn "modify" [
m-lay: modify-iteration-layout (id-iteration)
mid/pane: layout/offset/origin m-lay 0x0 5x5
show mid
]
tab
btn-sup-f-l: btn "delete" [
destruction: request/confirm "do you want to delete the iteration ?"
if destruction
[
delete-iteration (id-iteration)
end/pane: layout/offset/origin forum-iteration 1 0x0 5x5 show end
]
]
tab
inf-st-f-l: info (get-state-iteration id-iteration) 60x20
prog-st-f-l: progress red blue 100x20 do [prog-st-f-l/data: get-state-iteration-numeric (id-iteration) show prog-st-f-l]
return
]
return line
]
]
;fonctions qui produit une ligne de page de management de story
management-line-story-layout: func [
"cree une ligne de layout pour une page"
id-story [string!] "identifiant d'une story"
name-story [string!] "nom d'une story"
] [
use [line]
[
line: copy []
append line compose/deep
[
name-obj-f-l: text (name-story) 80x25 [
lay: story-presentation (id-story)
mid/pane: layout/offset/origin lay 0x0 5x5
show mid
end/pane: layout/offset/origin forum-task (id-story) 1 0x0 5x5
show end
]
btn-mod-f-l: btn "modify" [
m-lay: modify-story-layout (id-story)
mid/pane: layout/offset/origin m-lay 0x0 5x5
show mid
]
btn-sup-f-l: btn "delete" [
destruction: request/confirm "do you want to supress the story ?"
if destruction
[
delete-story (id-story)
end/pane: layout/offset/origin forum-story 1 0x0 5x5 show end
]
]
btn-add-task-f-l: btn "add task" [
mid/pane: layout/offset/origin create-task-layout (id-story) 0x0 5x5 show mid
]
inf-st-f-l: info (get-state-story id-story) 60x20
prog-st-f-l: progress red blue 100x20 do [prog-st-f-l/data: get-state-story-numeric (id-story) show prog-st-f-l]
return
]
return line
]
]
management-line-story-add-layout: func [
"cree une ligne de layout pour une page avec une possibilité d'ajouter la story a l'itération"
id-story [string!] "identifiant d'une story"
name-story [string!] "nom d'une story"
id-iteration [string!] "identifiant de l'itération"
] [
use [line]
[
line: copy []
append line compose/deep
[
name-obj-f-l: text (name-story) 80x25 [
lay: story-presentation (id-story)
mid/pane: layout/offset/origin lay 0x0 5x5
show mid
end/pane: layout/offset/origin forum-story 1 0x0 5x5
show end
]
btn-mod-f-l: btn "modify" [
m-lay: modify-story-layout (id-story)
mid/pane: layout/offset/origin m-lay 0x0 5x5
show mid
]
btn-sup-f-l: btn "delete" [
destruction: request/confirm "do you want to supress the story ?"
if destruction
[
delete-story (id-story)
end/pane: layout/offset/origin forum-story 1 0x0 5x5 show end
]
]
btn-sup-f-l: btn "add" [
addition: request/confirm "do you want to add story ?"
if addition
[
either not attempt [
add-story-iteration (id-story) (id-iteration)
]
[
foreach el wrong-fields [alert el]
return false
]
[
return true
]
]
]
inf-st-f-l: info (get-state-story id-story) 60x20
prog-st-f-l: progress red blue 100x20 do [prog-st-f-l/data: get-state-story-numeric (id-story) show prog-st-f-l]
return
]
return line
]
]
;ligne de page de management de task
management-line-tasks-layout: func [
"cree une ligne de layout pour une page de tasks"
id-task [string!] "identifiant d'une task"
name-task [string!] "nom d'une task"
] [
object-task: load-task id-task
id-story: object-task/story-task/1
use [line]
[
line: copy []
append line compose/deep
[
name-obj-f-l: text (name-task) 80x25 [
lay: task-presentation (id-task)
mid/pane: layout/offset/origin lay 0x0 5x5
show mid
end/pane: layout/offset/origin forum-test (id-task) 1 0x0 5x5
show end
]
btn-mod-f-l: btn "modify" [
m-lay: modify-task-layout (id-task)
mid/pane: layout/offset/origin m-lay 0x0 5x5
show mid
end/pane: layout/offset/origin forum-test (id-task) 1 0x0 5x5
show end
]
btn-sup-f-l: btn "delete" [
destruction: request/confirm "do you want to delete this task ?"
if destruction
[
delete-task (id-task)
end/pane: layout/offset/origin forum-task (id-story) 1 0x0 5x5 show end
]
]
btn-add-f-l: btn "add test" [
mid/pane: layout/offset/origin create-test-layout id-task 0x0 5x5 show mid
]
btn-add-f-l: btn "take me" [
mid/pane: layout/offset/origin take-task-layout id-task 0x0 5x5 show mid
]
inf-st-f-l: info (get-state-task id-task) 60x20
prog-st-f-l: progress red blue 100x20 do [prog-st-f-l/data: get-state-task-numeric (id-task) show prog-st-f-l]
return
]
return line
]
]
management-line-tests-layout: func [
"cree une ligne de layout pour une page de tests"
id-test [string!] "identifiant d'un test"
] [
name-test: "test"
object-test: load-test id-test
id-task: object-test/task-test
use [line]
[
line: copy []
append line compose/deep
[
name-obj-f-t: text (name-test) 80x25 [
lay: test-presentation (id-test)
mid/pane: layout/offset/origin lay 0x0 5x5 show mid
end/pane: layout/offset/origin [box 500x200 ivory] 0x0 5x5 show end
]
btn-sup-f-t: btn "delete" [
del: request/confirm "do you want to delete this test ?"
if del
[
delete-test (id-test)
end/pane: layout/offset/origin forum-test (id-task) 1 0x0 5x5 show end
]
]
chk-val-f-t: check [
validate-modified-state-test (id-test)
end/pane: layout/offset/origin forum-test (id-task) 1 0x0 5x5 show end
]
info-test: info (get-state-test id-test) 60x20
return
]
return line
]
]
management-line-tests-taken-layout: func [
"cree une ligne de layout pour une page de tests"
id-test [string!] "identifiant d'un test"
] [
name-test: "test"
object-test: load-test id-test
id-task: object-test/task-test
use [line]
[
line: copy []
append line compose/deep
[
name-obj-f-t: text (name-test) 80x25 [
lay: test-taken-presentation (id-test)
mid/pane: layout/offset/origin lay 0x0 5x5
show mid
hide end
]
btn-sup-f-t: btn "delete" [
del: request/confirm "do you want to delete this test ?"
if del
[
delete-test (id-test)
end/pane: layout/offset/origin forum-test (id-task) 1 0x0 5x5 show end
]
]
chk-val-f-t: check [
validate-modified-state-test (id-test)
end/pane: layout/offset/origin forum-test (id-task) 1 0x0 5x5 show end
]
info-test: info (get-state-test id-test) 60x20
return
]
return line
]
]
;ecrans de projet
;ecran de modification d'un projet
modify-project-layout: func ["fonction qui génère un layout de modification du projet"] [
modify-project: simple-layout-generator true ivory 500x200 [
[
below
[
[first-time my-label "modification of the project"]
]
]
[
across
[
[project-label my-label "project :"]
"tab"
[name-project-modified-field my-field get-project-name]
"return"
[date-label my-label "begining :"]
"tab"
[date-project-modified-info my-info get-project-date [my-date: request-date date-project-modified-info/text: my-date show date-project-modified-info]]
"return"
[desc-label my-label "summary :"]
"tab"
[description-project-modified-area my-area get-project-description]
"return"
[
validate my-button "validate" [either (validate-project-modified name-project-modified-field/text description-project-modified-area/text to-date date-project-modified-info/text)
[
;affichage des champs
;modification de la chaine de caractere du titre
proj-info-logo/text: get-project-name
name-project-field/text: get-project-name
date-info/text: get-project-date
description-area/text: get-project-description
show proj-info-logo
proj-info-logo/text
]
[
;affichage des champs echoués
proj-info-logo/text: get-project-name
name-project-field/text: get-project-name
date-info/text: get-project-date
description-area/text: get-project-description
foreach el wrong-fields [alert el]
foreach el I-O-problem [alert el]
]
]
]
]
]
]
return modify-project
]
;ecran de présentation du projet
project-presentation-layout: func ["fonction qui génère le layout de présentation du projet"] [
project-presentation: simple-layout-generator true ivory 500x200 [
[
across
[
[title-label my-label "project presentation"]
"return"
[project-label my-label "project :"]
"tab"
[name-project-field my-info get-project-name]
"return"
[desc-label my-label "begining :"]
[date-info my-info-date get-project-date]
[project-label my-label "state :"]
[state-project-field my-info-date get-state-project]
"tab"
[state-project-progress my-progress do [state-project-progress/data: test: get-state-project-numeric show state-project-progress]]
"return"
[desc-label my-label "summary :"]
"tab"
[description-area my-info-area get-project-description]
"return"
[
modify my-button "modify" ["gerer l'affichage du panneau de modif du projet"
mid/pane: layout/offset/origin modify-project-layout 0x0 5x5
show mid
end/pane: layout/offset/origin forum-iteration 1 0x0 5x5
show end
]
]
]
]
]
]
;écrans d'itération
;ecran de creation d'une iteration
create-iteration-layout: func ["cree l'écran d'une itération"] [
use [field1 field2] [
field1: copy ""
field2: copy ""
create-iteration-lay: simple-layout-generator true ivory 500x200 [
[
below
[
[first-time my-label "Iteration creation"]
]
]
[
across
[
[begining-cil my-label "begining"]
[begining-field-cil my-info-date "" [my-date: request-date begining-field-cil/text: to-string my-date show begining-field-cil]]
[end-cil my-label "end"]
[end-field-cil my-info-date "" [my-date: request-date end-field-cil/text: to-string my-date show end-field-cil]]
[title-label-cil my-label "title"]
[title-field-cil my-field field1]
]
]
[
below
[
[description-cil my-label "summary"]
[description-field-cil my-area field2]
[
validate-cil my-button "validate" [
either (test: validate-iteration begining-field-cil/text end-field-cil/text description-field-cil/text title-field-cil/text)
[
state-project-field/text: get-state-project
end/pane: layout/offset/origin forum-iteration 1 0x0 5x5 show end
]
[
alert ("problem with this iteration")
foreach el wrong-fields [alert el]
foreach el I-O-problem [alert el]
]
]
]
]
]
]
]
return create-iteration-lay
]
;ecran de présentation d'une itération
iteration-presentation: func [
"génère le layout qui présente une itération"
id-iteration [string!] "identifiant de l'itération a présenter"
] [
use [field1 field2 field3 field4 field5] [
either (not id-iteration = "none") [
field1: get-iteration-name id-iteration
field2: to-string get-iteration-begining id-iteration
field3: get-state-iteration id-iteration
field4: to-string get-iteration-end id-iteration
field5: get-iteration-description id-iteration
]
[
field1: ""
field2: ""
field3: ""
field4: ""
field5: ""
]
iteration-presentation-layout: simple-layout-generator true ivory 500x200 [
[
across
[
[title-label-ipl my-label "iteration presentation"]
"return"
[iteration-label-ipl my-label "iteration :"]
"tab"
[name-iteration-field-ipl my-info field1]
"return"
[begin-iteration-label-ipl my-label "begin :"]
[begin-info-ipl my-info-date field2]
[end-iteration-label-ipl my-label "end :"]
[end-info-ipl my-info-date field4]
[iteration-label-ipl my-label "state :"]
[state-iteration-field-ipl my-info-date field3]
"return"
[desc-iteration-label-ipl my-label "summary :"]
"tab"
[description-iteration-area-ipl my-info-area field5]
"return"
[
create-ipl my-button "create" ["gerer l'affichage du panneau de creation de l'itération"
mid/pane: layout/offset/origin create-iteration-layout 0x0 5x5
show mid
end/pane: layout/offset/origin forum-iteration 1 0x0 5x5
show end
]
]
[
add-st-ipl my-button "add story" [
"addition d'une histoire"
end/pane: layout/offset/origin forum-story-add 1 (id-iteration) 0x0 5x5
show end
]
]
]
]
]
]
]
; ecran de modification d'une itération
modify-iteration-layout: func [
"cree le bloc d'instructions vid qui va générer le layout de modification de l'itération"
id-iteration [string!] "identifiant de l'itération a présenter"
] [
use [field1 field2 field3 field4 field5] [
field1: get-iteration-name id-iteration
field2: to-string get-iteration-begining id-iteration
field3: get-state-iteration id-iteration
field4: to-string get-iteration-end id-iteration
field5: get-iteration-description id-iteration
iteration-modification-layout: simple-layout-generator true ivory 500x200 [
[
across
[
[title-label-mil my-label "Iteration modification"]
"return"
[iteration-label-mil my-label "iteration :"]
"tab"
[name-iteration-field-mil my-field field1]
"return"
[begin-iteration-label-mil my-label "begin :"]
[begin-info-mil my-info-date field2 [d: request-date begin-info-mil/text: d show begin-info-mil]]
[end-iteration-label-mil my-label "end :"]
[end-info-mil my-info-date field4 [d: request-date end-info-mil/text: d show end-info-mil]]
"return"
[desc-iteration-label-mil my-label "summary :"]
"tab"
[description-iteration-area-mil my-area field5]
"return"
[
validate-mil my-button "validate" [
test: validate-modified-iteration
to-string begin-info-mil/text
to-string end-info-mil/text
description-iteration-area-mil/text
name-iteration-field-mil/text id-iteration
either (test)
[
name-iteration-field-mil/text: get-iteration-name id-iteration
begin-info-mil/text: to-string get-iteration-begining id-iteration
end-info-mil/text: to-string get-iteration-end id-iteration
description-iteration-area-mil/text: get-iteration-description id-iteration
end/pane: layout/offset/origin forum-iteration 1 0x0 5x5
show end
]
[
name-iteration-field-mil/text: get-iteration-name id-iteration
begin-info-mil/text: to-string get-iteration-begining id-iteration
end-info-mil/text: to-string get-iteration-end id-iteration
description-iteration-area-mil/text: get-iteration-description id-iteration
end/pane: layout/offset/origin forum-iteration 1 0x0 5x5
show end
foreach el wrong-fields [alert el]
foreach el I-O-problem [alert el]
]
]
]
]
]
]
]
]
;écrans d'une story
;écran de présentation d'une story
story-presentation: func [
"génère le bloc d'instruction vid de l'écran"
id-story ["string"]
] [
use [field1 field2 field3 field4 field5 field6 field7 field8] [
either (not id-story = "none") [
field1: to-string get-story-title id-story
field2: to-string get-story-date id-story
field3: to-string get-state-story id-story
field4: to-string get-story-estimate id-story
field5: to-string get-story-description id-story
field6: to-string get-story-tech-risk id-story
field7: to-string get-story-tech-priority id-story
field8: to-string get-story-user-priority id-story
]
[
field1: ""
field2: ""
field3: ""
field4: ""
field5: ""
field6: ""
field7: ""
field8: ""
]
story-presentation-lay: simple-layout-generator true ivory 500x200 [
[
below
[
[title-psl my-label "Story presentation"]
]
]
[
across
[
[estimate-psl my-label "Estimate"]
[estimate-info-psl my-info-number field4]
[risk-csl my-label "Risk"]
[risk-field-csl my-info-number field6]
[user-prior-csl my-label "User priority"]
[user-prior-field-csl my-info-number field8]
[tech-prior-csl my-label "tech priority"]
[tech-prior-field-csl my-info-number field7]
"return"
[title-label-csl my-label "title"]
[title-field-csl my-info field1]
[date-psl my-label "date"]
[date-info-psl my-info-date field2]
"return"
[description-csl my-label "summary"]
[description-field-csl my-info-area field5]
]
]
[
below
[
"across"
[
create-psl my-button "create" [
mid/pane: layout/offset/origin create-story-layout 0x0 5x5
show mid
;end/pane: layout/offset/origin forum-story 1 0x0 5x5
;show end
]
]
[btn-add-task-f-l: my-button "add task" [
mid/pane: layout/offset/origin create-task-layout (id-story) 0x0 5x5 show mid
]]
]
]
]
]
]
;ecran de creation d'une story
create-story-layout: func ["cree le bloc d'instructions vid de l'écran de creation d'une story"] [
field1: copy ""
field2: copy ""
field3: copy ""
field4: copy ""
field5: copy ""
field6: copy ""
create-story-lay: simple-layout-generator true ivory 500x200 [
[
below
[
[first-time my-label "Story creation"]
]
]
[
across
[
[estimate-csl my-label "Estimate"]
[estimate-field-csl my-field-number field1]
[risk-csl my-label "Risk"]
[risk-field-csl my-field-number field2]
[user-prior-csl my-label "User priority"]
[user-prior-field-csl my-field-number field3]
[tech-prior-csl my-label "tech priority"]
[tech-prior-field-csl my-field-number field4]
"return" "tab"
[title-label-csl my-label "title"]
[title-field-csl my-field field5]
"return"
[description-csl my-label "summary"]
[description-field-csl my-area field6]
]
]
[
below
[
[
validate-csl my-button "validate" [
either (validate-story to-string now/date description-field-csl/text title-field-csl/text estimate-field-csl/text risk-field-csl/text user-prior-field-csl/text tech-prior-field-csl/text)
[
estimate-field-csl/text: copy "" show estimate-field-csl
risk-field-csl/text: copy "" show risk-field-csl
user-prior-field-csl/text: copy "" show user-prior-field-csl
tech-prior-field-csl/text: copy "" show tech-prior-field-csl
title-field-csl/text: copy "" show title-label-csl
description-field-csl/text: copy "" show description-field-csl
end/pane: layout/offset/origin forum-story 1 0x0 5x5 show end
]
[
alert ("problem with this story")
foreach el wrong-fields [alert el]
foreach el I-O-problem [alert el]
]
]
]
]
]
]
return create-story-lay
]
;ecran de modification d'une story
modify-story-layout: func [
"fonction qui génère le bloc d'instruction vid de l'écran de modification de la story"
id-story [string!] "identifiant de la story"
] [
use [field1 field2 field3 field4 field5 field6 field7 field8] [
either (not id-story = "none") [
field1: to-string get-story-title id-story
field2: to-string get-story-date id-story
field4: to-string get-story-estimate id-story
field5: to-string get-story-description id-story
field6: to-string get-story-tech-risk id-story
field7: to-string get-story-tech-priority id-story
field8: to-string get-story-user-priority id-story
]
[
field1: ""
field2: ""
field3: ""
field4: ""
field5: ""
field6: ""
field7: ""
field8: ""
]
story-modification-lay: simple-layout-generator true ivory 500x200 [
[
below
[
[title-psl my-label "Story modification"]
]
]
[
across
[
[estimate-msl my-label "Estimate"]
[estimate-field-msl my-field-number field4]
[risk-msl my-label "Risk"]
[risk-field-msl my-field-number field6]
[user-prior-msl my-label "User priority"]
[user-prior-field-msl my-field-number field8]
[tech-prior-msl my-label "tech priority"]
[tech-prior-field-msl my-field-number field7]
"return"
[title-label-msl my-label "title"]
[title-field-msl my-field field1]
[date-psl my-label "date"]
[date-info-msl my-info-date field2 [d: request-date date-info-msl/text: d show date-info-msl]]
"return"
[description-msl my-label "summary"]
[description-field-msl my-area field5]
]
]
[
below
[
[
create-psl my-button "validate" [
test: validate-modified-story
to-string date-info-msl/text
description-field-msl/text
title-field-msl/text
estimate-field-msl/text
risk-field-msl/text
user-prior-field-msl/text
tech-prior-field-msl/text
id-story
either (test)
[
title-field-msl/text: to-string get-story-title id-story
date-info-msl/text: to-string get-story-date id-story
estimate-field-msl/text: to-string get-story-estimate id-story
field5: to-string get-story-description id-story
risk-field-msl/text: to-string get-story-tech-risk id-story
tech-prior-field-msl/text: to-string get-story-tech-priority id-story
user-prior-field-msl/text: to-string get-story-user-priority id-story
end/pane: layout/offset/origin forum-story 1 0x0 5x5
show end
]
[
title-field-msl/text: to-string get-story-title id-story
date-info-msl/text: to-string get-story-date id-story
estimate-field-msl/text: to-string get-story-estimate id-story
field5: to-string get-story-description id-story
risk-field-msl/text: to-string get-story-tech-risk id-story
tech-prior-field-msl/text: to-string get-story-tech-priority id-story
user-prior-field-msl/text: to-string get-story-user-priority id-story
foreach el I-O-problem [alert el]
foreach el wrong-fields [alert el]
]
]
]
]
]
]
]
return story-modification-lay
]
;écrans d'une task
;création d'une task
create-task-layout: func [
"génère le bloc d'instruction vid de l'écran de création des tasks"
id-story [string!] "identifiant de la story a laquelle la task sera rattachée"
] [
use [field1 field2 field3 field4 field5 field6] [
field1: copy ""
field2: copy ""
field3: copy ""
field4: copy ""
field5: copy ""
field6: copy ""
create-task-lay: simple-layout-generator true ivory 500x200 [
[
below
[
[first-time my-label "Task creation"]
]
]
[
across
[
"tab"
[my-title-task-mtl my-label-task "title"]
[my-title-task-field-mtl my-field-task field1]
"return"
[my-in-task-mtl my-label-task "In"]
[my-in-task-field-mtl my-area-task field3]
[my-out-task-mtl my-label-task "out"]
[my-out-task-field-mtl my-area-task field4]
"return"
[my-responsabilities-task-mtl my-label-task "Resp."]
[my-responsabilities-task-mtl my-area-task field5]
[my-collaborations-task-mtl my-label-task "Coll."]
[my-collaborations-task-field-mtl my-area-task field6]
]
]
[
below
[
[
validate-csl my-button "validate" [
either (validate-task id-story now/date my-title-task-field-mtl/text my-in-task-field-mtl/text my-out-task-field-mtl/text my-responsabilities-task-mtl/text my-collaborations-task-field-mtl/text)
[
end/pane: layout/offset/origin forum-task (id-story) 1 0x0 5x5 show end
]
[
alert ("problem with this task")
foreach el wrong-fields [alert el]
foreach el I-O-problem [alert el]
]
]
]
]
]
]
]
return create-task-lay
]
;écran de modification d'une task
modify-task-layout: func [
"génère le bloc d'instruction vid de l'écran de modification de la task"
id-task [string!] "identifiant de la task"
] [
use [field1 field2 field3 field4 field5 field6 field7] [
either (not id-task = "none") [
field1: get-title-task id-task
object-story: load-story get-story-task id-task
field2: object-story/title-story
field3: get-in-task id-task
field4: get-out-task id-task
field5: get-responsabilities-task id-task
field6: get-collaborations-task id-task
field7: get-date-task id-task
]
[
field1: ""
field2: ""
field3: ""
field4: ""
field5: ""
field6: ""
field7: ""
]
task-modification-lay: simple-layout-generator true ivory 500x200 [
[
below
[
[first-time my-label "Task modification"]
]
]
[
across
[
[my-title-task-mtl my-label-task "title"]
[my-title-task-field-mtl my-field-task field1]
[my-story-task-mtl my-label-task "Story"]
[my-story-task-field-mtl my-field-task field2]
"return"
[my-in-task-mtl my-label-task "In"]
[my-in-task-field-mtl my-area-task field3]
[my-out-task-mtl my-label-task "out"]
[my-out-task-field-mtl my-area-task field4]
"return"
[my-responsabilities-task-mtl my-label-task "Resp."]
[my-responsabilities-task-mtl my-area-task field5]
[my-collaborations-task-mtl my-label-task "Coll."]
[my-collaborations-task-field-mtl my-area-task field6]
"return"
]
]
[
across
[
[
validate-psl my-button "validate" [
either (validate-task id-story now/date my-title-task-field-mtl/text my-story-task-field-mtl/text my-in-task-field-mtl/text my-out-task-field-mtl/text my-responsabilities-task-mtl/text my-collaborations-task-field-mtl/text)
[
end/pane: layout/offset/origin forum-task (id-story) 1 0x0 5x5 show end
]
[
alert ("problem with this task")
foreach el wrong-fields [alert el]
foreach el I-O-problem [alert el]
]
]
]
[my-title-task-mtl my-label-task "date"]
[my-title-task-field-mtl my-field-task field7]
]
]
]
]
return task-modification-lay
]
;écran de présentation d'une task
task-presentation: func [
"cree le bloc d'instructions vid de l'écran de présentation des tasks"
id-task [string!]
] [use [field1 field2 field3 field4 field5 field6] [
field1: get-title-task id-task
get-story-task id-task
object-story: load-story get-story-task id-task
field2: object-story/title-story
field3: get-in-task id-task
field4: get-out-task id-task
field5: get-responsabilities-task id-task
field6: get-collaborations-task id-task
field7: get-date-task id-task
field8: get-story-task id-task
presentation-task-lay: simple-layout-generator true ivory 500x200 [
[
below
[
[first-time my-label "Task presentation"]
]
]
[
across
[
[my-title-task-ptl my-label-task "title"]
[my-title-task-field-ptl my-field-task field1]
[my-story-task-ptl my-label-task "Story"]
[my-story-task-field-ptl my-field-task field2]
"return"
[my-in-task-ptl my-label-task "In"]
[my-in-task-field-ptl my-area-task field3]
[my-out-task-ptl my-label-task "out"]
[my-out-task-field-ptl my-area-task field4]
"return"
[my-responsabilities-task-ptl my-label-task "Resp."]
[my-responsabilities-task-ptl my-area-task field5]
[my-collaborations-task-ptl my-label-task "Coll."]
[my-collaborations-task-field-ptl my-area-task field6]
"return"
[my-title-task-ptl my-label-task "date"]
[my-title-task-field-ptl my-field-task field7]
[
validate-rep: my-button "To story"
[
mid/pane: layout/offset/origin story-presentation field8 0x0 5x5 show mid
end/pane: layout/offset/origin forum-task field8 1 0x0 5x5 show end
]
]
[
btn-add-f-l: my-button "add test" [
mid/pane: layout/offset/origin create-test-layout id-task 0x0 5x5 show mid
]
]
]
]
]
]
return presentation-task-lay
]
working-task-presentation: func [
"présente la task en cours"
id-task "identifiant de la task"
]
[
use [field1 field2 field3 field4 field5 field6] [
field1: get-title-task id-task
get-story-task id-task
object-story: load-story get-story-task id-task
field2: object-story/title-story
field3: get-in-task id-task
field4: get-out-task id-task
field5: get-responsabilities-task id-task
field6: get-collaborations-task id-task
field7: get-date-task id-task
field8: get-story-task id-task
presentation-task-lay: simple-layout-generator true ivory 500x200 [
[
below
[
[first-time my-label " Your mission :"]
]
]
[
across
[
[my-title-task-ptl my-label-task "title"]
[my-title-task-field-ptl my-field-task field1]
[my-story-task-ptl my-label-task "Story"]
[my-story-task-field-ptl my-field-task field2]
"return"
[my-in-task-ptl my-label-task "In"]
[my-in-task-field-ptl my-area-task field3]
[my-out-task-ptl my-label-task "out"]
[my-out-task-field-ptl my-area-task field4]
"return"
[my-responsabilities-task-ptl my-label-task "Resp."]
[my-responsabilities-task-ptl my-area-task field5]
[my-collaborations-task-ptl my-label-task "Coll."]
[my-collaborations-task-field-ptl my-area-task field6]
"return"
[my-title-task-ptl my-label-task "date"]
[my-title-task-field-ptl my-field-task field7]
[
validate-rep: my-button "leave task"
[
either (request/confirm "do you produce production code ?")
[
leave-task-prod-code (id-task)
mid/pane: layout/offset/origin story-presentation field8 0x0 5x5 show mid
end/pane: layout/offset/origin forum-task field8 1 0x0 5x5 show end
]
[
leave-task-spike (id-task)
mid/pane: layout/offset/origin story-presentation field8 0x0 5x5 show mid
end/pane: layout/offset/origin forum-task field8 1 0x0 5x5 show end
]
]
]
[
btn-add-f-l: my-button "add test" [
mid/pane: layout/offset/origin create-test-layout id-task 0x0 5x5 show mid
]
]
]
]
]
]
return presentation-task-lay
]
take-task-layout: func [
"presenter la saisie d'une task"
id-task [string!] "identifiant de la task"
]
[
take-task-lay: simple-layout-generator true ivory 500x200 [
[
across
[
[ord-rep my-text "You are about to take this task. If you work in pair, give the name of your companion, let it blank if you are alone"]
"return"
[name-companion my-text "name :"]
[name-companion-field my-field ""]
"return"
[
validate-rep: button "validate"
[either (check-companion name-companion-field/text)
[
either (take-task (id-task))
[
mid/pane: layout/offset/origin working-task-presentation (id-task) 0x0 5x5 show mid
end/pane: layout/offset/origin forum-test-working (id-task) 1 0x0 5x5 show end
]
[
alert "You cannot take this task"
if (not empty? working-task)
[
alert "dont forget your mission"
mid/pane: layout/offset/origin working-task-presentation (id-task) 0x0 5x5 show mid
end/pane: layout/offset/origin forum-test-working (id-task) 1 0x0 5x5 show end
]
]
] [
mid/pane: layout/offset/origin add-companion-layout (id-task) 0x0 5x5 show mid
end/pane: layout/offset/origin [box 500x225 ivory] 0x0 5x5 show end
]
]
]
]
return take-task-lay
]
]
]
;écran de création d'un test
create-test-layout: func [
"cree le bloc d'instructions vid de l'écran de creation d'un test"
id-task [string!]
] [
use [field1] [
create-test-lay: simple-layout-generator true ivory 500x200 [
[
below
[
[first-time my-label "Test creation"]
]
]
[
across
[
[In-ctel my-label "In"]
[In-ctel my-field-small ""]
[Out-label-ctel my-label "Out"]
[Out-field-ctel my-field-small ""]
"return"
[description-ctel my-label "summary"]
[description-field-ctel my-area ""]
"return"
[Pre-cond-ctel my-label "Pre-cond"]
[Pre-cond-field-ctel my-field-small ""]
[Post-cond-ctel my-label "Post-cond"]
[Post-cond-field-ctel my-field-small ""]
]
]
[
below
[
[
validate-ctel my-button "validate" [
either (
validate-test
id-task
now/date
description-field-ctel/text
Pre-cond-field-ctel/text
Post-cond-field-ctel/text
In-ctel/text
Out-field-ctel/text
)
[
description-field-ctel/text: "" show description-field-ctel
In-ctel/text: "" show In-ctel
Out-field-ctel/text: "" show Out-field-ctel
Pre-cond-field-ctel/text: "" show Pre-cond-field-ctel
Post-cond-field-ctel/text: "" show Post-cond-field-ctel
]
[
alert ("problem with this test")
foreach el wrong-fields [alert el]
foreach el I-O-problem [alert el]
]
]
]
]
]
]
]
return create-test-lay
]
;écran de présentation d'un test
test-presentation: func [
"cree le bloc d'instructions vid de l'écran de présentation des tests"
id-test [string!]
] [
field1: get-in-test id-test
field2: get-out-test id-test
field3: get-summary-test id-test
field4: to-string get-date-test id-test
field5: get-state-test id-test
field6: get-pre-cond-test id-test
field7: get-post-cond-test id-test
id-task: get-task-test id-test
presentation-test-lay: simple-layout-generator true ivory 500x200 [
[
below
[
[first-time my-label "Test presentation"]
]
]
[
across
[
[In-ctel my-label "In"]
[In-ctel my-field-small field1]
[Out-label-ctel my-label "Out"]
[Out-field-ctel my-field-small field2]
"return"
[description-ctel my-label "summary"]
[description-field-ctel my-area field3]
"return"
[Pre-cond-ctel my-label "Pre-cond"]
[Pre-cond-field-ctel my-field-small field6]
[Post-cond-ctel my-label "Post-cond"]
[Post-cond-field-ctel my-field-small field7]
"return"
[date-ctel my-label "date"]
[date-field-ctel my-field-small field4]
[state-ctel my-label "state"]
[state-field-ctel my-field-small field5]
[validate-login my-button "To task" [
mid/pane: layout/offset/origin task-presentation (id-task) 0x0 5x5 show mid
end/pane: layout/offset/origin forum-test (id-task) 1 0x0 5x5 show end
]
]
]
]
]
return presentation-test-lay
]
test-taken-presentation: func [
"cree le bloc d'instructions vid de l'écran de présentation des tests"
id-test [string!]
] [
field1: get-in-test id-test
field2: get-out-test id-test
field3: get-summary-test id-test
field4: to-string get-date-test id-test
field5: get-state-test id-test
field6: get-pre-cond-test id-test
field7: get-post-cond-test id-test
id-task: get-task-test id-test
presentation-test-lay: simple-layout-generator true ivory 500x200 [
[
below
[
[first-time my-label "Test presentation"]
]
]
[
across
[
[In-ctel my-label "In"]
[In-ctel my-field-small field1]
[Out-label-ctel my-label "Out"]
[Out-field-ctel my-field-small field2]
"return"
[description-ctel my-label "summary"]
[description-field-ctel my-area field3]
"return"
[Pre-cond-ctel my-label "Pre-cond"]
[Pre-cond-field-ctel my-field-small field6]
[Post-cond-ctel my-label "Post-cond"]
[Post-cond-field-ctel my-field-small field7]
"return"
[date-ctel my-label "date"]
[date-field-ctel my-field-small field4]
[state-ctel my-label "state"]
[state-field-ctel my-field-small field5]
[validate-login my-button "To task" [
mid/pane: layout/offset/origin working-task-presentation (id-task) 0x0 5x5 show mid
end/pane: layout/offset/origin forum-test (id-task) 1 0x0 5x5 show end
]
]
]
]
]
return presentation-test-lay
]
repository-modification-layout: func [
"permet de changer de repository"
] [
rep-mod-lay: simple-layout-generator true ivory 500x200 [
[
across
[
[ord-rep my-text "type the url of your repository or let it blank if you dont have one"]
"return"
[text-rep my-text "URL :"]
[url-rep-file my-field ""]
"return"
[
validate-rep: button "validate"
[either (validate-repository url-rep-file/text)
[
alert "done"
] [
alert wrong-fields
]
]
]
]
return rep-mod-lay
]
]
]
add-companion-layout: func [
"ecran de creation du binome"
id-task [string!] "identifiant de la task"
] [
use [field1 field2] [
foreach el wrong-fields [alert el]
field1: copy ""
field2: copy ""
end/pane: layout/offset/origin [box 500x200 ivory] 0x0 5x5 show end
c-u-lay: simple-layout-generator true ivory 500x200 [
[
below
[
[first-time my-label "it seems that your friend is not registred, please register him : his name is needed"]
]
]
[
below
[
[name-label my-label "name"]
[name-field my-field field1]
[email-label my-label "email"]
[email-field my-field field2]
[validate-login my-button "validate" [either (validate-user name-field/text email-field/text)
[
field1: ""
field2: ""
show mid
alert "done"
mid/pane: layout/offset/origin take-task-layout id-task 0x0 5x5 show mid
end/pane: layout/offset/origin forum-test id-task 1 0x0 5x5 show end
]
[
foreach el wrong-fields [alert el]
]
]
]
]
]
]
]
]
princ-lay: [
at 2x2
en-tete-logo: panel 500x60 0.0.125 [
logo: text "XPDev" yellow font-size 20
across
en-tete: text "you are logged as" yellow font-size 12
name-logo: text get-name-user yellow [alert rejoin ["email: " get-email-user get-name-user]]
on-proj: text "on the project" yellow font-size 12
proj-info-logo: text 125x24 get-project-name yellow
[
mid/pane: layout/offset/origin project-presentation-layout 0x0 5x5 show mid
end/pane: layout/offset/origin forum-iteration 1 0x0 5x5 show end
]
]
menu: panel 500x30 0.255.187 [
at 5x5
first-text: text "Iteration" underline [
mid/pane: layout/offset/origin iteration-presentation get-first-iteration 0x0 5x5 show mid
end/pane: layout/offset/origin forum-iteration 1 0x0 5x5 show end
]
at 55x5
second-text: text "Story" underline [
mid/pane: layout/offset/origin story-presentation get-first-story 0x0 5x5 show mid
end/pane: layout/offset/origin forum-story 1 0x0 5x5 show end
]
at 95x5
text "|"
at 125x5
text "Repository" underline [
mid/pane: layout/offset/origin repository-modification-layout 0x0 5x5 show mid
end/pane: layout/offset/origin [box 500x250 ivory] 0x0 5x5 show end
]
]
mid: box 500x200
end: box blue 500x225
do [
mid/pane: layout/offset/origin project-presentation-layout 0x0 5x5 show mid
end/pane: layout/offset/origin forum-iteration 1 0x0 5x5 show end
]
]
]
;ecrans de situés hors de la fenetre principale
;ecran de creation du projet
launch-project-layout: func [
"genere l'écran permettant de creer un projet"
] [
use [field1 field2 field3 field4] [
foreach el wrong-fields [alert el]
field1: copy ""
field2: copy ""
launch-proj-lay: simple-layout-generator true green 500x200 [
[
below
[
[first-time my-label "it seems that you are about to launch a project, fill the fields and ... GOOD LUCK"]
]
]
[
across
[
[project-label my-label "project :"]
"tab"
[name-project-field my-field field1]
"return"
[desc-label my-label "summary :"]
"tab"
[description-area my-area field2]
"return"
[
validate my-button "validate" [either (validate-project name-project-field/text description-area/text)
[
view layout main-layout
]
[
foreach el wrong-fields [alert el]
foreach el I-O-problem [alert el]
]
]
]
]
]
]
return launch-proj-lay
]
]
;ecran de creation d'un user
create-user-layout: func [
"ecran de creation du user"
] [
use [field1 field2] [
foreach el wrong-fields [alert el]
field1: copy ""
field2: copy ""
c-u-lay: simple-layout-generator true green 500x200 [
[
below
[
[first-time my-label "it seems that you attempt to connect for the first time, please register your informations : your name is needed"]
]
]
[
across
[
[name-label my-label "name"]
[name-field my-field field1]
]
]
[
return
[]
]
[
across
[
[email-label my-label "email"]
[email-field my-field field2]
[validate-login my-button "validate" [either (validate-user name-field/text email-field/text)
[
view layout login-layout []
]
[
foreach el wrong-fields [alert el]
]
]]]
]
]
]
]
;login sans password
login-layout: func [
"login sans password"
] [
field1: copy ""
simple-layout-generator true ivory 300x200 [
[
below
[
[first-time my-label "Welcome on XPDev"]
]
]
[
across
[
[name-login my-label "name"]
[name-field-login my-field field1]
]
]
[
below
[
[
validate-login my-button "validate"
[
either (check-existence-user name-field-login/text)
[
set-name-user name-field-login/text
either (check-name-project)
[
view layout
main-layout
]
[
view layout
launch-project-layout []
]
]
[
view layout
create-user-layout []
]
]
]
]
]
]
]
;écran de saisie du repository
repository-layout: func [
"objet face de l'écran de saisie de l'url du repository"
] [layout [
across
text-rep: text underline font-size 16 "type the url of your repository or let it blank if you dont have one"
return
text-rep: text font-size 16 black "URL "
url-rep: field 250x20 ""
return
validate-rep: button "validate"
[either (validate-repository url-rep/text)
[
view layout login-layout
] [
alert wrong-fields
]
]
]]
;point d'entrée du mvc
either (repository-url/1 = "none")
[
rep-lay: repository-layout
rep-lay/offset: 350x500
view layout rep-lay
]
[
view layout login-layout
] |