module
marking
// This example show how marks can be given by people logged in
// The marks are intended for user 0 who can show them
// (c) mjp 2007
import
StdEnv, iTasks, iDataTrivial
import
iTaskUtil
derive
gForm Mark, []
derive
gUpd Mark,
Maybe, [], Account, Login
derive
gParse Mark
derive
gPrint Mark, Maybe
derive
gerda Mark
:: Mark =
{userName
:: String, loginId :: Int,
mark :: Int, comment :: String}
Start
world = doHtmlServer (singleUserTask
-1 True (assignWork False welcome admin marking))
world
welcome
= [ Txt "This is
an application where all users can give a marking or comment to some event they
watch together.",Br,Br
, Txt "If you are administrated,
simply login.",Br
, Txt "If not, you can create a login.",Br,Br,Br]
?>> OK
admin
v = return_V Void
marking
all=:(name,uniqueId,state)
| uniqueId == 0 = [Txt
"Welcome Root",Br,Br] !>> foreverTask show
| otherwise = [Txt ("Welcome user " <+++
name <+++ ", you have id " <+++ uniqueId),Br,Br] !>> foreverTask
(respond all)
show
= readMarksDB
=>> \marks -> [ Txt "Here are the scores given by the users:",
Br, Br
,
STable [Tbl_Border 1] [[Txt (toString
(number i marks)) \\ i <- [0..10]]
,[B
[] (toString i) \\ i <- [0..10]]
]
,
Br, Br
, Hr []
, Marquee []
(foldl (+++) "" [m.userName
+++ " : " +++ m.comment
+++ " +++ " \\ m <-
marks ])
, Hr []
] ?>> Confirm "Refresh"
where number i marks =
length [n\\n <- marks | n.mark == i]
respond
acc=:(name,uniqueId,state)
= readMarksDB
=>> \marks
-> return_V
(case [m \\ m <- marks | m.loginId == uniqueId] of
[] -> (-1,"")
[{mark,comment}:_] -> (mark, comment)
)
=>> \mc-> orTasks [ ("Show Opinions",show)
,
("Give a Mark",giveMark
mc)
,
("Give Comment",giveComment
mc)
]
where
giveMark
(mark,comment)
= [ Txt ("Previous mark given:" <+++ if (mark ==
-1) "No mark given" (toString mark)), Br,
Br
, Txt "Give
your new mark (0 = lowest, 10 = highest)", Br, Br
]
?>> chooseTask [(toString i,return_V
i) \\ i <- [0..2]] -||-
chooseTask [(toString
i,return_V i) \\ i <- [3..5]] -||-
chooseTask [(toString
i,return_V i) \\ i <- [6..8]] -||-
chooseTask [(toString
i,return_V i) \\ i <- [9..10]]
=>> \mark -> writeMarksDB {userName = name, loginId = uniqueId, mark = mark, comment = comment}
#>> [Txt ("Your mark "
<+++ mark <+++ " has been stored!"),Br,Br]
?>> OK
giveComment
(mark,comment)
= [ Txt "Previous comment given:", Br, Br
, Txt
(if (comment == "" ) "None" comment), Br, Br
, Txt
"Submit a new comment:", Br, Br]
?>>
editTask "OK" textBox
<<@ Submit
=>> \(TextArea _ _ comment) -> writeMarksDB
{userName = name, loginId =
uniqueId, mark = mark, comment = comment}
#>> [ Txt "Your comment:", Br, Br
, Txt
comment, Br, Br
, Txt
"has been stored!",Br,Br
]
?>>
OK
textBox :: TextArea
textBox
= createDefault
Confirm
name = chooseTask [(name,return_V Void)]
OK = chooseTask [("OK",return_V Void)]
//
database specialized
marksId :: DBid
[Mark]
marksId
= mkDBid "marks"
readMarksDB :: (Task [Mark])
readMarksDB = readDB
marksId
readMarksDB2 :: (Task [Mark])
readMarksDB2
= readDB2 marksId
writeMarksDB :: Mark -> (Task [Mark])
writeMarksDB acc
= readMarksDB
=>> \accs
-> writeDB
marksId [acc:[oacc \\ oacc <- accs | oacc.loginId <> acc.loginId]]