package Ġcomponents Ċ Ċ import ĠAuth Ċ import ĠPage Name Ċ import ĠReq Method Ċ import ĠRole Ċ import ĠStr Ċ import Ġdebug Ċ import ĠerrorMessage Ċ import Ġfetch E ms Ċ import Ġget Container Ċ import Ġget Elem ById Ċ import Ġget Elem ById As Ċ import Ġget Elem ById OrNull Ċ import Ġhttp 2 0 0 Ċ import Ġhttp 4 0 0 Ċ import Ġkotlinx . coroutines . Main Scope Ċ import Ġkotlinx . coroutines . await Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġobj Of Ċ import Ġon Van illa Click Ċ import Ġorg . w 3 c . dom . HTML TextArea Element Ċ import Ġparse To Ċ import Ġqueries . Basic Course Info Ċ import Ġtm Render Ċ import Ġkotlin . browser . window Ċ import Ġkotlin . dom . clear Ċ Ċ object ĠPart icipants Page Ġ: ĠEasy Page () Ġ{ ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠPart icipants ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstudents : ĠList < Participant >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġte achers : ĠList < Participant > ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠPart icipant ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġemail : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgiven _ name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfamily _ name : ĠString ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠNew Student ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstudent _ id _ or _ email : ĠString ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠNo Student Found ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattrs : ĠMissing Student , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog _ msg : ĠString ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠMissing Student ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmissing _ student : ĠString ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġval Ġpage Name : ĠAny ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠPage Name . P ARTIC IP ANT S ĊĊĠĠĠ Ġoverride Ġfun Ġpath Matches ( path : ĠString ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . matches ("^ / courses / \\ w +/ participants /? $ ") ĊĊĠĠĠ Ġoverride Ġfun Ġbuild ( page State Str : ĠString ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġpost New Students ( student Ids : ĠList < String >, Ġcourse Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" Post ing Ġnew Ġstudents : Ġ$ student Ids " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Students Ġ= Ġstudent Ids . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNew Student ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp Ġ= Ġfetch E ms ("/ courses /$ course Id / students ", ĠReq Method . POST , Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" students " Ġto Ġnew Students )). await () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resp . http 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resp . http 4 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Student Body Ġ= Ġresp . parse To ( No Student Found . serializer ()). await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( no Student Body . code Ġ== Ġ" ST UD ENT _ NOT _ FOUND ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ{ Ġ" Ei Ġle id n ud Ġk as ut aj anime / email iga ĠÃ µ pil ast : Ġ${ no Student Body . attrs . missing _ student }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( no Student Body . log _ msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ{ ĠStr . something W ent Wrong () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Adding Ġstudents Ġfailed Ġwith Ġstatus Ġ${ resp . status }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġtoggle Add Students ( course Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( get Elem ById OrNull (" add - students - wrap ") Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBox Ġnot Ġvisible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" Open Ġadd Ġstudents Ġbox " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Elem ById (" add - students - section "). innerHTML Ġ= Ġtm Render (" tm - te ach - participants - add ", Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" add Students Help " Ġto Ġ" Ã ķ pil aste Ġl is am ise ks Ġs ise sta Ġk as ut aj ate Ġk as ut aj an imed Ġv Ãµ i Ġme ilia ad ress id Ġer al di Ġr idade le Ġv Ãµ i Ġer al dat una Ġt Ã¼ h ik ute ga .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" add Students Field Label " Ġto Ġ" Ã ķ pil aste Ġn ime ki ri ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" add Button Label " Ġto Ġ" L isa " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Elem ById (" add - students - button "). on Van illa Click ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMain Scope (). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġids Ġ= Ġget Elem ById As < HTML TextArea Element >(" new - students - field "). value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split (" Ġ", Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotBlank () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost New Students ( ids , Ġcourse Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Elem ById (" add - students - link "). innerHTML Ġ= Ġ" &# 9 6 6 0 ; ĠSul ge " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBox Ġis Ġvisible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" Close Ġadd Ġstudents Ġbox " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Elem ById (" add - students - section "). clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Elem ById (" add - students - link "). innerHTML Ġ= Ġ" &# 9 6 5 8 ; ĠL isa ĠÃ µ pil asi " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Auth . active Role Ġ!= ĠRole . ADMIN Ġ&& ĠAuth . active Role Ġ!= ĠRole . TE AC HER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ{ ĠStr . no Permission For Page () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" User Ġis Ġnot Ġadmin Ġnor Ġteacher ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcourse Id Ġ= Ġextract Sanit ized Course Id ( window . location . pathname ) ĊĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" Course ĠID : Ġ$ course Id " Ġ} ĊĊĠĠĠĠĠĠĠ ĠMain Scope (). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparticipants Promise Ġ= Ġfetch E ms ("/ courses /$ course Id / participants ", ĠReq Method . GET ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcourse Info Promise Ġ= ĠBasic Course Info . get ( course Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp Ġ= Ġparticipants Promise . await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcourse Title Ġ= Ġcourse Info Promise . await (). title ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! resp . http 2 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ{ ĠStr . something W ent Wrong () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Fetching Ġparticipants Ġfailed Ġwith Ġstatus Ġ${ resp . status }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparticipants Ġ= Ġresp . parse To ( Participants . serializer ()). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ"$ participants " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstudents Ġ= Ġparticipants . students . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto Ġ"${ it . given _ name } Ġ${ it . family _ name }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" username " Ġto Ġit . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" email " Ġto Ġit . email ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Typed Array () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġte achers Ġ= Ġparticipants . te achers . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto Ġ"${ it . given _ name } Ġ${ it . family _ name }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" username " Ġto Ġit . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" email " Ġto Ġit . email ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Typed Array () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Container (). innerHTML Ġ= Ġtm Render (" tm - te ach - participants ", Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" my Courses Label " Ġto Ġ" Min u Ġk urs used ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" title " Ġto Ġcourse Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" course Href " Ġto Ġ"/ courses /$ course Id / exercises ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" participants Label " Ġto Ġ" Os ale jad ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" te achers Label " Ġto Ġ" Ã ķ pe ta jad ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" name Label " Ġto Ġ" N imi ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" username Label " Ġto Ġ" K as ut aj anim i ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" email Label " Ġto Ġ" Email ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" students Label " Ġto Ġ" Ã ķ pil ased ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" add Students Link " Ġto Ġ" &# 9 6 5 8 ; ĠL isa ĠÃ µ pil asi ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" students " Ġto Ġstudents , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" te achers " Ġto Ġte achers ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Elem ById (" add - students - link "). on Van illa Click ( true ) Ġ{ Ġtoggle Add Students ( course Id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Sanit ized Course Id ( path : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= Ġpath . match ("^ / courses /( \\ w +)/ participants /? $ ") ĊĠĠĠĠĠĠĠ Ġif Ġ( match Ġ!= Ġnull Ġ&& Ġmatch . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmatch [ 1 ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Unexpected Ġmatch Ġon Ġpath : Ġ${ match ?. join ToString () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }