module delegate

 

import StdEnv, iTasks, iDataTrivial

 

// (c) 2007 MJP

 

// Quite a difficult workflow exercise given to me by Erik Zuurbier (Thanks Erik).

// 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 (foreverTask (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,TCl task) ->    if (isJust stopped) (delegateToSomeone task set) task  

     

            stopTask          = buttonTask "Stop" (return_V True)                                            

 

            stopTask2         = stopTask -||- (0 @:: stopTask)                                  // alternative : now also user 0 can stop the work

 

            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