module delegate import StdEnv, htmlTask, htmlTrivial // (c) 2007 MJP // Quite a difficult workflow exercise given to me by Erik Zuurbier. // First a set of person id's is made to which a task can be delegated // The task is actually shipped to the first person who accepts the task // That person can stop the task whenever he wants // Now again everybody in the set is asked again to accept the task // The one who accepts can *continue* the work already done so far // This process can be repeated as many times one likes until finally the task is finished derive gForm [], Maybe derive gUpd [], Maybe derive gPrint Maybe npersons = 5 //Start world = doHtmlServer (multiUserTask npersons True (delegate mytask2 (Time 0 3 0) <<@ TxtFile)) world Start world = doHtmlServer (multiUserTask npersons True (delegate mytask2 (Time 0 3 0) )) world mytask = editTask "Done" 0 mytask2 = editTask "Done1" 0 =>> \v1 -> editTask "Done2" 0 =>> \v2 -> editTask "Done3" 0 =>> \v3 -> return_D (v1 + v2 + v3) delegate :: (Task a) HtmlTime -> (Task a) | iData a delegate task time = [Txt "Choose persons you want to delegate work to:",Br,Br] ?>> determineSet [] =>> \set -> delegateToSomeone task set =>> \result -> return_D result where delegateToSomeone :: (Task a) [Int] -> (Task a) | iData a delegateToSomeone task set = newTask "delegateToSet" doDelegate where doDelegate = orTasks [("Waiting for " <+++ who, who @:: buttonTask "I Will Do It" (return_V who)) \\ who <- set] =>> \who -> who @:: stopTask2 -!> task =>> \(stopped,TClosure task) -> if (isJust stopped) (delegateToSomeone task set) task stopTask = buttonTask "Stop" (return_V True) stopTask2 = stopTask -||- (0 @:: stopTask) // stopTask2 = stopTask -||- timerStop time -||- (0 @:: stopTask) timerStop time = waitForTimerTask time #>> return_V True determineSet set = newTask "determineSet" determineSet` where determineSet` = [Txt ("Current set:" +++ print set)] ?>> chooseTask [("Add Person", cancelTask choosePerson =>> \nr -> return_V nr) ,("Finished", return_V Nothing) ] =>> \result -> case result of (Just new) -> determineSet (sort (removeDup [new:set])) Nothing -> return_V set choosePerson = editTask "Set" (PullDown (1,100) (0,[toString i \\ i <- [1..npersons]])) =>> \whomPD -> return_V (Just (toInt(toString whomPD))) cancelTask task = task -||- buttonTask "Cancel" (return_V createDefault) print [] = "" print [x:xs] = toString x +++ " " +++ print xs