module deadline
import StdEnv, htmlTask, htmlTrivial
derive gForm []
derive gUpd []
// (c) MJP 2007
// One can select a user to whom a task is delegated
// This user will get a certain amount of time to finish the task
// If the task is not finished on time, the task will be shipped back to the original user who has to do it instead
// It is also possible that the user becomes impatient and he can cancel the delegated task even though the deadline is not reached
npersons = 5
Start world = doHtmlServer (multiUserTask npersons True (foreverTask (deadline mytask))) world
mytask = editTask "OK" 0 <| ((<) 23,\n -> [Txt ("Error " <+++ n <+++ " should be larger than 23")])
deadline :: (Task a) -> (Task a) | iData a
deadline task
= [Txt "Choose person you want to delegate work to:",Br,Br]
?>> editTask "Set" (PullDown (1,100) (0,map toString [1..npersons])) =>> \whomPD ->
[Txt "How long do you want to wait?",Br,Br]
?>> editTask "SetTime" (Time 0 0 0) =>> \time ->
[Txt "Cancel delegated work if you are getting impatient:",Br,Br]
?>> delegateTask (toInt(toString whomPD)) time task
-||-
buttonTask "Cancel" (return_V (False,createDefault))=>> CheckDone
where
CheckDone (ok,value)
| ok = [Txt ("Result of task: " +++ printToString value),Br,Br]
?>> buttonTask "OK" (return_V value)
= [Txt "Task expired or canceled, you have to do it yourself!",Br,Br]
?>> buttonTask "OK" task
delegateTask who time task
= ("Timed Task",who)
@: (( waitForTimeTask time #>> // wait for deadline
return_V (False,createDefault) ) // return default value
-||-
([Txt ("Please finish task before " <+++ time),Br,Br] // tell deadline
?>> task =>> \v -> return_V (True,v))) // do task and return its result