From ae8d4978dd1399341b27d7f381b734ae84bcda51 Mon Sep 17 00:00:00 2001 From: acanas Date: Thu, 23 Apr 2020 02:28:28 +0200 Subject: [PATCH] Version19.193.1 --- css/{swad19.190.css => swad19.193.1.css} | 353 +++++++++++++++++++++++ js/{swad19.172.1.js => swad19.193.1.js} | 111 +++++++ swad_action.c | 2 +- swad_changelog.h | 8 +- swad_exam_event.c | 170 +++++------ swad_exam_event.h | 6 +- swad_exam_result.c | 6 +- swad_layout.c | 95 +++++- 8 files changed, 640 insertions(+), 111 deletions(-) rename css/{swad19.190.css => swad19.193.1.css} (94%) rename js/{swad19.172.1.js => swad19.193.1.js} (93%) diff --git a/css/swad19.190.css b/css/swad19.193.1.css similarity index 94% rename from css/swad19.190.css rename to css/swad19.193.1.css index 562c26581..cbe33181a 100644 --- a/css/swad19.190.css +++ b/css/swad19.193.1.css @@ -2743,6 +2743,359 @@ table.CELLS_PAD_10 > tbody > tr > td {padding:10px;} padding-bottom:20px; } +/*********************************** Exams ***********************************/ +.EXA_BG + { + background-image:url("/swad/icon/bg.jpg"); + background-size:cover; + background-repeat:no-repeat; + height:100%; + background-color:white; + } +.EXA_CONT + { + box-sizing:border-box; + display:table; + margin:2%; + width:96%; + } +.EXA_LEFT_TCH + { + box-sizing:border-box; + float:left; + width:20%; + white-space:nowrap; + overflow:hidden; + text-overflow:ellipsis; + } +.EXA_LEFT_STD + { + box-sizing:border-box; + float:left; + width:40%; + white-space:nowrap; + overflow:hidden; + text-overflow:ellipsis; + } +.EXA_RIGHT_TCH + { + box-sizing:border-box; + display:table; + float:left; + width:80%; + } +.EXA_RIGHT_STD + { + box-sizing:border-box; + display:table; + float:left; + width:60%; + } +.EXA_TOP + { + box-sizing:border-box; + width:100%; + height:64px; + color:#404040; + font-size:16pt; + font-weight:bold; + text-overflow:ellipsis; + } +.EXA_BOTTOM + { + box-sizing:border-box; + width:100%; + } + +.EXA_REFRESHABLE_TEACHER + { + box-sizing:border-box; + width:100%; + white-space:nowrap; + overflow:hidden; + text-overflow:ellipsis; + } +.EXA_NUM_QST + { + color:#404040; + font-size:32pt; + font-weight:bold; + text-align:center; + vertical-align:top; + } +.EXA_TIME_QST + { + color:#404040; + font-size:16pt; + font-weight:bold; + text-align:center; + vertical-align:top; + } +.EXA_SHOW_HOURGLASS, .EXA_SHOW_ANSWERED, .EXA_REM_MY_ANS, .EXA_SHOW_RESULTS + { + text-align:center; + padding:16pt 0; + } +.EXA_NUM_ANSWERERS + { + text-align:center; + padding:8pt 0; + color:#404040; + font-size:16pt; + } + +.EXA_BUTTONS_CONT + { + display:table; + box-sizing:border-box; + width:100%; + padding:20px 0; + } +.EXA_BUTTON_LEFT_CONT + { + display:table; + box-sizing:border-box; + float:left; + width:35%; + text-align:center; + } +.EXA_BUTTON_CENTER_CONT + { + display:table; + box-sizing:border-box; + float:left; + width:30%; + text-align:center; + } +.EXA_BUTTON_RIGHT_CONT + { + display:table; + box-sizing:border-box; + float:left; + width:35%; + text-align:center; + } + +.EXA_BIGBUTTON_CONT + { + box-sizing:border-box; + display:inline-block; + font-size:32pt; + font-weight:bold; + padding:2px; + text-align:center; + vertical-align:middle; + } +.EXA_SMALLBUTTON_CONT + { + box-sizing:border-box; + display:inline-block; + font-size:16pt; + font-weight:bold; + padding:2px; + text-align:center; + vertical-align:middle; + } +.EXA_BUTTON_ON, .EXA_BUTTON_OFF + { + display:table-cell; + width:100%; + text-align:center; + vertical-align:middle; + opacity:0.7; + } +.EXA_BUTTON_ON:hover + { + opacity:1; + } + +.EXA_BUTTON_HIDDEN + { + display:table-cell; + width:100%; + text-align:center; + vertical-align:middle; + opacity:0.1; + } + +.EXA_RED {color:#913b00;} +.EXA_YELLOW {color:#a27600;} +.EXA_LIMEGREEN {color:#636e00;} +.EXA_GREEN {color:#246600;} + +.EXA_TCH_STEM + { + color:#202020; + font-size:24pt; + padding-bottom:24pt; + } +.EXA_TCH_ANS + { + color:#202020; + font-size:24pt; + } + +.EXA_WAIT_CONT + { + box-sizing:border-box; + margin-top:5%; + text-align:center; + } +.EXA_WAIT_IMG + { + box-sizing:border-box; + width:100px; + } + +.EXA_SCO_SCO + { + width:5%; + text-align:right; + vertical-align:middle; + height:10px; + font-size:6pt; + font-weight:bold; + } +.EXA_SCO_NUM + { + width:95%; + text-align:left; + vertical-align:middle; + background:white; + height:10px; + font-size:6pt; + font-weight:bold; + } +.EXA_SCO_BAR + { + display:inline-block; + height:10px; + vertical-align:middle; + } +.EXA_SCO_TOP + { + color:grey; + border-style:solid solid none solid; + border-width:1px; + } +.EXA_SCO_MID + { + color:grey; + border-style:none solid none solid; + border-width:1px; + } +.EXA_SCO_BOT + { + color:grey; + border-style:none solid solid solid; + border-width:1px; + } + +.EXA_TCH_BUTTON_TD + { + box-sizing:border-box; + width:84px; + text-align:center; + vertical-align:top; + } +.EXA_TCH_BUTTON + { + box-sizing:border-box; + width:64px; + margin:0 16px; + padding:8px; + border-radius:2px; + border-width:1px; + border-style:solid; + color:rgba(255,255,255,0.75); + font-size:36pt; + font-weight:bold; + line-height:normal; + white-space:nowrap; + } + +.EXA_NUM_COL_OFF + { + display:table-cell; + box-sizing:border-box; + padding:6px; + text-align:center; + vertical-align:middle; + border:solid 1px; + border-color:transparent; + } +.EXA_NUM_COL_ON + { + display:table-cell; + box-sizing:border-box; + padding:6px; + text-align:center; + vertical-align:middle; + border:solid 1px; + border-color:#404040; + background-color:rgba(0,0,0,0.1); + } + +.EXA_STD_CELL + { + text-align:center; + vertical-align:middle; + } + +.EXA_STD_BUTTON + { + box-sizing:border-box; + width:100%; + margin:10px auto; + padding:20px; + border-radius:2px; + border-width:1px; + border-style:solid; + color:rgba(255,255,255,0.75); + font-size:44pt; + font-weight:bold; + line-height:normal; + white-space:nowrap; + } + +.EXA_STD_ANSWER_SELECTED + { + box-shadow: 0px 0px 18px 12px rgba(0,128,0,1); + animation:fadeinshadow 1s ease forwards; + } +@keyframes fadeinshadow + { + from {box-shadow:0px 0px 18px 12px rgba(0,128,0,1);} + to {box-shadow:none;} + } + +.EXA_RESULT + { + padding:10px 0; + color:#404040; + font-size:16pt; + text-align:left; + vertical-align:top; + } +.EXA_RES_TR + { + height:10px; + } +.EXA_RES_CORRECT + { + width:1%; + background:green; + } +.EXA_RES_WRONG + { + width:1%; + background:red; + } +.EXA_RES_VOID + { + width:1%; + } + /********************************** Matches **********************************/ .MCH_BG { diff --git a/js/swad19.172.1.js b/js/swad19.193.1.js similarity index 93% rename from js/swad19.172.1.js rename to js/swad19.193.1.js index f84446c1a..c58f00155 100644 --- a/js/swad19.172.1.js +++ b/js/swad19.193.1.js @@ -547,6 +547,117 @@ function readConnUsrsData () { } } +/*****************************************************************************/ +/******* Automatic refresh of current exam event question using AJAX *********/ +/*****************************************************************************/ + +// This function must be called from time to time +var objXMLHttpReqExaEvtStd = false; +function refreshExamEventStd () { + objXMLHttpReqExaEvtStd = AJAXCreateObject(); + if (objXMLHttpReqExaEvtStd) { + var RefreshParams = RefreshParamNxtActExaEvt + '&' + + RefreshParamExaEvtCod + '&' + + RefreshParamIdSes; + + objXMLHttpReqExaEvtStd.onreadystatechange = readExamEventStdData; // onreadystatechange must be lowercase + objXMLHttpReqExaEvtStd.open('POST',ActionAJAX,true); + objXMLHttpReqExaEvtStd.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); + objXMLHttpReqExaEvtStd.send(RefreshParams); + } +} + +function readExamEventStdData () { + if (objXMLHttpReqExaEvtStd.readyState == 4) { // Check if data have been received + if (objXMLHttpReqExaEvtStd.status == 200) { + var htmlExamEvent = objXMLHttpReqExaEvtStd.responseText; // Get HTML code + + var div = document.getElementById('exam_event'); // Access to refreshable DIV + if (div) + div.innerHTML = htmlExamEvent; // Update DIV content + // Global delay variable is set initially in swad-core + setTimeout('refreshExamEventStd()',delayExamEvent); + } + } +} + +/*****************************************************************************/ +/** Automatic refresh of left part of current exam event question using AJAX **/ +/*****************************************************************************/ + +//This function must be called from time to time +var objXMLHttpReqExaEvtTch = false; +function refreshExamEventTch () { + objXMLHttpReqExaEvtTch = AJAXCreateObject(); + if (objXMLHttpReqExaEvtTch) { + var RefreshParams = RefreshParamNxtActExaEvt + '&' + + RefreshParamExaEvtCod + '&' + + RefreshParamIdSes; + + objXMLHttpReqExaEvtTch.onreadystatechange = readExamEventTchData; // onreadystatechange must be lowercase + objXMLHttpReqExaEvtTch.open('POST',ActionAJAX,true); + objXMLHttpReqExaEvtTch.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); + objXMLHttpReqExaEvtTch.send(RefreshParams); + } +} + +function readExamEventTchData () { + if (objXMLHttpReqExaEvtTch.readyState == 4) { // Check if data have been received + if (objXMLHttpReqExaEvtTch.status == 200) { + var endOfId = objXMLHttpReqExaEvtTch.responseText.indexOf('|',0 ); // Get separator position + var endOfEv = objXMLHttpReqExaEvtTch.responseText.indexOf('|',endOfId + 1); // Get separator position + + var id = objXMLHttpReqExaEvtTch.responseText.substring(0 ,endOfId); // Get id + var ev = objXMLHttpReqExaEvtTch.responseText.substring(endOfId + 1,endOfEv); // Get ev ('0' / '1') + var html = objXMLHttpReqExaEvtTch.responseText.substring(endOfEv + 1); // Get HTML code + + var div = document.getElementById(id); // Access to refreshable DIV + if (div) { + div.innerHTML = html; // Update DIV content + + if (parseInt(ev)) { // 0 / 1 + // Scripts in div got via AJAX are not executed ==> execute them + evalScriptsInElem (div); + + // Process mathematics; see http://docs.mathjax.org/en/latest/advanced/typeset.html + // MathJax.Hub.Queue(["Typeset",MathJax.Hub,div]); // old versions + MathJax.typeset(); + } + } + + // Global delay variable is set initially in swad-core + setTimeout('refreshExamEventTch()',delayExamEvent); + } + } +} + +/*****************************************************************************/ +/**************** Update exam event control area using AJAX ******************/ +/*****************************************************************************/ + +// This function is called when user submit a form inside two parent divs +function updateExamEventTch (id,Params) { + var objXMLHttp = false; + + objXMLHttp = AJAXCreateObject (); + if (objXMLHttp) { + /* Send request to server */ + objXMLHttp.onreadystatechange = function() { // onreadystatechange must be lowercase + if (objXMLHttp.readyState == 4) { // Check if data have been received + if (objXMLHttp.status == 200) + if (id) { + var div = document.getElementById(id); // Access to DIV + if (div) + div.innerHTML = objXMLHttp.responseText; // Update DIV content + } + } + }; + objXMLHttp.open('POST',ActionAJAX,true); + objXMLHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + objXMLHttp.send(Params); + } +} + /*****************************************************************************/ /********** Automatic refresh of current match question using AJAX ***********/ /*****************************************************************************/ diff --git a/swad_action.c b/swad_action.c index 61d110bc8..8a5c94991 100644 --- a/swad_action.c +++ b/swad_action.c @@ -546,7 +546,7 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = [ActSeeAsg ] = { 801, 1,TabAss,ActSeeAsg ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Asg_SeeAssignments ,"edit" }, [ActSeePrj ] = {1674, 2,TabAss,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_SeeProjects ,"file-invoice" }, [ActReqTst ] = { 103, 3,TabAss,ActReqTst ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_RequestTest ,"check" }, - [ActSeeAllExa ] = {1848, 4,TabAss,ActSeeAllExa ,0x200,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Exa_SeeAllExams ,"file-signature" }, + [ActSeeAllExa ] = {1848, 4,TabAss,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Exa_SeeAllExams ,"file-signature" }, [ActSeeAllGam ] = {1649, 4,TabAss,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_SeeAllGames ,"gamepad" }, [ActSeeAllSvy ] = { 966, 5,TabAss,ActSeeAllSvy ,0x3F8,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Svy_SeeAllSurveys ,"poll" }, [ActSeeAllExaAnn ] = { 85, 6,TabAss,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaAnn_ListExamAnnouncementsSee,"bullhorn" }, diff --git a/swad_changelog.h b/swad_changelog.h index dcbed7b0f..76c2b70a5 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -497,9 +497,9 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - * En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 19.193 (2020-04-22)" -#define CSS_FILE "swad19.190.css" -#define JS_FILE "swad19.172.1.js" +#define Log_PLATFORM_VERSION "SWAD 19.193.1 (2020-04-23)" +#define CSS_FILE "swad19.193.1.css" +#define JS_FILE "swad19.193.1.js" /* * Call parameters: @@ -552,6 +552,8 @@ Funci // TODO: Cambiar icono notificaciones nuevas con "bell-on.svg" // TODO: Ahmed El Moukhtari Koubaa: Cuando le damos a la opción de mostrar solo los mensajes no leídos, se muestran estos mensajes, pero cuando los intentamos leer, es decir, hacemos clic sobre ellos se recarga toda la página por así decirlo y vuelve a dar una lista con los mensajes, pero descartando aquel que clicamos porque, entiendo yo al menos, que ya lo ha marcado como leído. + Version 19.193.1: Apr 23, 2020 Changes in CSS for exams. + Changes in JavaScript for exams. (297623 lines) Version 19.193: Apr 22, 2020 Created database tables related to exams. (297127 lines) 2 changes necessary in database: CREATE TABLE IF NOT EXISTS exa_answers (EvtCod INT NOT NULL,UsrCod INT NOT NULL,QstInd INT NOT NULL,NumOpt TINYINT NOT NULL,AnsInd TINYINT NOT NULL,UNIQUE INDEX(EvtCod,UsrCod,QstInd)); diff --git a/swad_exam_event.c b/swad_exam_event.c index 10073b729..c885f0e82 100644 --- a/swad_exam_event.c +++ b/swad_exam_event.c @@ -119,7 +119,7 @@ static void ExaEvt_ListOneOrMoreEventsAuthor (const struct ExaEvt_Event *Event); static void ExaEvt_ListOneOrMoreEventsTimes (const struct ExaEvt_Event *Event,unsigned UniqueId); static void ExaEvt_ListOneOrMoreEventsTitleGrps (const struct ExaEvt_Event *Event); static void ExaEvt_GetAndWriteNamesOfGrpsAssociatedToEvent (const struct ExaEvt_Event *Event); -static void ExaEvt_ListOneOrMoreEventsNumPlayers (const struct ExaEvt_Event *Event); +static void ExaEvt_ListOneOrMoreEventsNumParticipants (const struct ExaEvt_Event *Event); static void ExaEvt_ListOneOrMoreEventsStatus (struct ExaEvt_Event *Event,unsigned NumQsts); static void ExaEvt_ListOneOrMoreEventsResult (struct Exa_Exams *Exams, const struct ExaEvt_Event *Event); @@ -221,11 +221,11 @@ static void ExaEvt_PutBigButtonClose (void); static void ExaEvt_ShowWaitImage (const char *Txt); -static void ExaEvt_RemoveOldPlayers (void); +static void ExaEvt_RemoveOldParticipants (void); static void ExaEvt_UpdateEventAsBeingPlayed (long EvtCod); static void ExaEvt_SetEventAsNotBeingPlayed (long EvtCod); static bool ExaEvt_GetIfEventIsBeingPlayed (long EvtCod); -static void ExaEvt_GetNumPlayers (struct ExaEvt_Event *Event); +static void ExaEvt_GetNumParticipants (struct ExaEvt_Event *Event); static void ExaEvt_RemoveMyAnswerToEventQuestion (const struct ExaEvt_Event *Event); @@ -397,8 +397,8 @@ void ExaEvt_GetDataOfEventByCod (struct ExaEvt_Event *Event) Event->Status.QstStartTimeUTC = (time_t) 0; Event->Status.Showing = ExaEvt_START; Event->Status.Countdown = -1L; - Event->Status.Playing = false; - Event->Status.NumPlayers = 0; + Event->Status.Happening = false; + Event->Status.NumParticipants = 0; Event->Status.NumCols = ExaEvt_NUM_COLS_DEFAULT; Event->Status.ShowQstResults = false; Event->Status.ShowUsrResults = false; @@ -476,7 +476,7 @@ static void ExaEvt_ListOneOrMoreEvents (struct Exa_Exams *Exams, if (ICanEditEvents) ExaEvt_ListOneOrMoreEventsIcons (Exams,&Event); - /* Event player */ + /* Event participant */ ExaEvt_ListOneOrMoreEventsAuthor (&Event); /* Start/end date/time */ @@ -485,8 +485,8 @@ static void ExaEvt_ListOneOrMoreEvents (struct Exa_Exams *Exams, /* Title and groups */ ExaEvt_ListOneOrMoreEventsTitleGrps (&Event); - /* Number of players who have answered any question in the exam event */ - ExaEvt_ListOneOrMoreEventsNumPlayers (&Event); + /* Number of participants who have answered any question in the exam event */ + ExaEvt_ListOneOrMoreEventsNumParticipants (&Event); /* Event status */ ExaEvt_ListOneOrMoreEventsStatus (&Event,Exam->NumQsts); @@ -508,8 +508,8 @@ static void ExaEvt_ListOneOrMoreEventsHeading (bool ICanEditEvents) { extern const char *Txt_ROLES_SINGUL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME]; - extern const char *Txt_Match; - extern const char *Txt_Players; + extern const char *Txt_Event; + extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; extern const char *Txt_Status; extern const char *Txt_Results; @@ -524,8 +524,8 @@ static void ExaEvt_ListOneOrMoreEventsHeading (bool ICanEditEvents) HTM_TH (1,1,"LT",Txt_ROLES_SINGUL_Abc[Rol_TCH][Usr_SEX_UNKNOWN]); HTM_TH (1,1,"LT",Txt_START_END_TIME[Exa_ORDER_BY_START_DATE]); HTM_TH (1,1,"LT",Txt_START_END_TIME[Exa_ORDER_BY_END_DATE ]); - HTM_TH (1,1,"LT",Txt_Match); - HTM_TH (1,1,"RT",Txt_Players); + HTM_TH (1,1,"LT",Txt_Event); + HTM_TH (1,1,"RT",Txt_ROLES_PLURAL_Abc[Rol_STD][Usr_SEX_UNKNOWN]); HTM_TH (1,1,"CT",Txt_Status); HTM_TH (1,1,"CT",Txt_Results); @@ -739,12 +739,12 @@ bool ExaEvt_CheckIfMatchIsAssociatedToGrp (long EvtCod,long GrpCod) } /*****************************************************************************/ -/******************* Put a column for number of players **********************/ +/**************** Put a column for number of participants ********************/ /*****************************************************************************/ -static void ExaEvt_ListOneOrMoreEventsNumPlayers (const struct ExaEvt_Event *Event) +static void ExaEvt_ListOneOrMoreEventsNumParticipants (const struct ExaEvt_Event *Event) { - /***** Number of players who have answered any question in the exam event ******/ + /***** Number of participants who have answered any question in the exam event ******/ HTM_TD_Begin ("class=\"DAT RT COLOR%u\"",Gbl.RowEvenOdd); HTM_Unsigned (ExaEvt_GetNumUsrsWhoHaveAnswerEvt (Event->EvtCod)); HTM_TD_End (); @@ -983,9 +983,9 @@ static void ExaEvt_GetEventDataFromRow (MYSQL_RES *mysql_res, /***** Get whether the exam event is being played or not *****/ if (Event->Status.Showing == ExaEvt_END) // Event over - Event->Status.Playing = false; + Event->Status.Happening = false; else // Event not over - Event->Status.Playing = ExaEvt_GetIfEventIsBeingPlayed (Event->EvtCod); + Event->Status.Happening = ExaEvt_GetIfEventIsBeingPlayed (Event->EvtCod); } /*****************************************************************************/ @@ -1434,10 +1434,10 @@ void ExaEvt_ResumeEvent (void) { struct ExaEvt_Event Event; - /***** Remove old players. + /***** Remove old participants. This function must be called by a teacher before getting exam event status. *****/ - ExaEvt_RemoveOldPlayers (); + ExaEvt_RemoveOldParticipants (); /***** Get data of the exam event from database *****/ Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed (); @@ -1451,7 +1451,7 @@ void ExaEvt_ResumeEvent (void) ExaEvt_UpdateEventStatusInDB (&Event); /***** Show current exam event status *****/ - HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\""); + HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\""); ExaEvt_ShowMatchStatusForTch (&Event); HTM_DIV_End (); } @@ -1730,7 +1730,7 @@ static void ExaEvt_UpdateEventStatusInDB (const struct ExaEvt_Event *Event) char *EvtSubQuery; /***** Update end time only if exam event is currently being played *****/ - if (Event->Status.Playing) // Event is being played + if (Event->Status.Happening) // Event is being played { if (asprintf (&EvtSubQuery,"exa_events.EndTime=NOW(),") < 0) Lay_NotEnoughMemoryExit (); @@ -1763,7 +1763,7 @@ static void ExaEvt_UpdateEventStatusInDB (const struct ExaEvt_Event *Event) Event->EvtCod,Gbl.Hierarchy.Crs.CrsCod); free (EvtSubQuery); - if (Event->Status.Playing) // Event is being played + if (Event->Status.Happening) // Event is being played /* Update exam event as being played */ ExaEvt_UpdateEventAsBeingPlayed (Event->EvtCod); else // Event is paused, not being played @@ -1778,7 +1778,7 @@ static void ExaEvt_UpdateEventStatusInDB (const struct ExaEvt_Event *Event) static void ExaEvt_UpdateElapsedTimeInQuestion (const struct ExaEvt_Event *Event) { /***** Update elapsed time in current question in database *****/ - if (Event->Status.Playing && // Event is being played + if (Event->Status.Happening && // Event is being played Event->Status.Showing != ExaEvt_START && Event->Status.Showing != ExaEvt_END) DB_QueryINSERT ("can not update elapsed time in question", @@ -1874,28 +1874,28 @@ void ExaEvt_PlayPauseEvent (void) { struct ExaEvt_Event Event; - /***** Remove old players. + /***** Remove old participants. This function must be called by a teacher before getting exam event status. *****/ - ExaEvt_RemoveOldPlayers (); + ExaEvt_RemoveOldParticipants (); /***** Get data of the exam event from database *****/ Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed (); ExaEvt_GetDataOfEventByCod (&Event); /***** Update status *****/ - if (Event.Status.Playing) // Event is being played ==> pause it - Event.Status.Playing = false; // Pause exam event + if (Event.Status.Happening) // Event is being played ==> pause it + Event.Status.Happening = false; // Pause exam event else // Event is paused, not being played ==> play it /* If not over, update status */ if (Event.Status.Showing != ExaEvt_END) // Event not over - Event.Status.Playing = true; // Start/resume exam event + Event.Status.Happening = true; // Start/resume exam event /***** Update exam event status in database *****/ ExaEvt_UpdateEventStatusInDB (&Event); /***** Show current exam event status *****/ - HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\""); + HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\""); ExaEvt_ShowMatchStatusForTch (&Event); HTM_DIV_End (); } @@ -1908,10 +1908,10 @@ void ExaEvt_ChangeNumColsEvt (void) { struct ExaEvt_Event Event; - /***** Remove old players. + /***** Remove old participants. This function must be called by a teacher before getting exam event status. *****/ - ExaEvt_RemoveOldPlayers (); + ExaEvt_RemoveOldParticipants (); /***** Get data of the exam event from database *****/ Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed (); @@ -1928,7 +1928,7 @@ void ExaEvt_ChangeNumColsEvt (void) ExaEvt_UpdateEventStatusInDB (&Event); /***** Show current exam event status *****/ - HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\""); + HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\""); ExaEvt_ShowMatchStatusForTch (&Event); HTM_DIV_End (); } @@ -1941,10 +1941,10 @@ void ExaEvt_ToggleVisibilResultsEvtQst (void) { struct ExaEvt_Event Event; - /***** Remove old players. + /***** Remove old participants. This function must be called by a teacher before getting exam event status. *****/ - ExaEvt_RemoveOldPlayers (); + ExaEvt_RemoveOldParticipants (); /***** Get data of the exam event from database *****/ Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed (); @@ -1960,7 +1960,7 @@ void ExaEvt_ToggleVisibilResultsEvtQst (void) ExaEvt_UpdateEventStatusInDB (&Event); /***** Show current exam event status *****/ - HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\""); + HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\""); ExaEvt_ShowMatchStatusForTch (&Event); HTM_DIV_End (); } @@ -1973,10 +1973,10 @@ void ExaEvt_BackEvent (void) { struct ExaEvt_Event Event; - /***** Remove old players. + /***** Remove old participants. This function must be called by a teacher before getting exam event status. *****/ - ExaEvt_RemoveOldPlayers (); + ExaEvt_RemoveOldParticipants (); /***** Get data of the exam event from database *****/ Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed (); @@ -1989,7 +1989,7 @@ void ExaEvt_BackEvent (void) ExaEvt_UpdateEventStatusInDB (&Event); /***** Show current exam event status *****/ - HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\""); + HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\""); ExaEvt_ShowMatchStatusForTch (&Event); HTM_DIV_End (); } @@ -2002,10 +2002,10 @@ void ExaEvt_ForwardEvent (void) { struct ExaEvt_Event Event; - /***** Remove old players. + /***** Remove old participants. This function must be called by a teacher before getting exam event status. *****/ - ExaEvt_RemoveOldPlayers (); + ExaEvt_RemoveOldParticipants (); /***** Get data of the exam event from database *****/ Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed (); @@ -2018,7 +2018,7 @@ void ExaEvt_ForwardEvent (void) ExaEvt_UpdateEventStatusInDB (&Event); /***** Show current exam event status *****/ - HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\""); + HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\""); ExaEvt_ShowMatchStatusForTch (&Event); HTM_DIV_End (); } @@ -2077,7 +2077,7 @@ static void ExaEvt_SetMatchStatusToStart (struct ExaEvt_Event *Event) { Event->Status.QstInd = 0; // Before first question Event->Status.QstCod = -1L; - Event->Status.Playing = false; + Event->Status.Happening = false; Event->Status.Showing = ExaEvt_START; } @@ -2141,7 +2141,7 @@ static void ExaEvt_SetMatchStatusToEnd (struct ExaEvt_Event *Event) { Event->Status.QstInd = ExaEvt_AFTER_LAST_QUESTION; // After last question Event->Status.QstCod = -1L; - Event->Status.Playing = false; + Event->Status.Happening = false; Event->Status.Showing = ExaEvt_END; } @@ -2268,7 +2268,7 @@ static void ExaEvt_ShowLeftColumnTch (struct ExaEvt_Event *Event) HTM_DIV_Begin ("class=\"EXA_LEFT_TCH\""); /***** Refreshable part *****/ - HTM_DIV_Begin ("id=\"match_left\" class=\"EXA_REFRESHABLE_TEACHER\""); + HTM_DIV_Begin ("id=\"exam_event_left\" class=\"EXA_REFRESHABLE_TEACHER\""); ExaEvt_ShowRefreshablePartTch (Event); HTM_DIV_End (); @@ -2383,14 +2383,14 @@ static void ExaEvt_WriteNumRespondersQst (struct ExaEvt_Event *Event) break; } - /***** Write number of players *****/ - if (Event->Status.Playing) // Event is being played + /***** Write number of participants *****/ + if (Event->Status.Happening) // Event is being played { - /* Get current number of players */ - ExaEvt_GetNumPlayers (Event); + /* Get current number of participants */ + ExaEvt_GetNumParticipants (Event); - /* Show current number of players */ - HTM_TxtF ("/%u",Event->Status.NumPlayers); + /* Show current number of participants */ + HTM_TxtF ("/%u",Event->Status.NumParticipants); } /***** End block *****/ @@ -2487,7 +2487,7 @@ static void ExaEvt_PutFormCountdown (struct ExaEvt_Event *Event,long Seconds,con if (PutForm) { /***** Start form *****/ - if (asprintf (&OnSubmit,"updateMatchTch('match_left'," + if (asprintf (&OnSubmit,"updateMatchTch('exam_event_left'," "'act=%ld&ses=%s&EvtCod=%ld&Countdown=%ld');" " return false;", // return false is necessary to not submit form Act_GetActCod (ActExaEvtCntDwn),Gbl.Session.Id, @@ -2582,7 +2582,7 @@ static void ExaEvt_ShowLeftColumnStd (const struct ExaEvt_Event *Event, /***** Write whether question is answered or not *****/ ExaEvt_PutIfAnswered (Event,Answered); - if (Event->Status.Playing && // Event is being played + if (Event->Status.Happening && // Event is being played Event->Status.Showing == ExaEvt_ANSWERS && // Teacher's screen is showing question answers Answered) // I have answered this question /***** Put icon to remove my answet *****/ @@ -2611,7 +2611,7 @@ static void ExaEvt_ShowRightColumnStd (struct ExaEvt_Event *Event, ExaEvt_ShowEventTitleStd (Event); /***** Bottom row *****/ - if (Event->Status.Playing) // Event is being played + if (Event->Status.Happening) // Event is being played { if (Event->Status.Showing == ExaEvt_END) // Event over ExaEvt_ShowWaitImage (Txt_Please_wait_); @@ -2619,8 +2619,8 @@ static void ExaEvt_ShowRightColumnStd (struct ExaEvt_Event *Event, { HTM_DIV_Begin ("class=\"EXA_BOTTOM\""); - /***** Update players ******/ - if (ExaEvt_RegisterMeAsPlayerInEvent (Event)) + /***** Update participants ******/ + if (ExaEvt_RegisterMeAsParticipantInEvent (Event)) { if (Event->Status.Showing == ExaEvt_ANSWERS) // Teacher's screen is showing question answers /* Show current question and possible answers */ @@ -2698,7 +2698,7 @@ static void ExaEvt_PutMatchControlButtons (const struct ExaEvt_Event *Event) /***** Center button *****/ HTM_DIV_Begin ("class=\"EXA_BUTTON_CENTER_CONT\""); - if (Event->Status.Playing) // Event is being played + if (Event->Status.Happening) // Event is being played /* Put button to pause exam event */ ExaEvt_PutBigButton (ActPlyPauExaEvt,"play_pause",Event->EvtCod, ExaEvt_ICON_PAUSE,Txt_Pause); @@ -2844,7 +2844,7 @@ static void ExaEvt_PutIfAnswered (const struct ExaEvt_Event *Event,bool Answered HTM_DIV_Begin ("class=\"EXA_SHOW_ANSWERED\""); /***** Put icon with link *****/ - if (Event->Status.Playing && // Event is being played + if (Event->Status.Happening && // Event is being played Event->Status.Showing == ExaEvt_ANSWERS && // Teacher's screen is showing question answers Answered) // I have answered this question { @@ -2976,7 +2976,7 @@ static void ExaEvt_ShowQuestionAndAnswersTch (const struct ExaEvt_Event *Event) switch (Event->Status.Showing) { case ExaEvt_ANSWERS: - if (Event->Status.Playing) // Event is being played + if (Event->Status.Happening) // Event is being played /* Write answers */ ExaEvt_WriteAnswersEventResult (Event, &Question, @@ -3494,10 +3494,10 @@ static void ExaEvt_ShowWaitImage (const char *Txt) } /*****************************************************************************/ -/**************************** Remove old players *****************************/ +/************************** Remove old participants **************************/ /*****************************************************************************/ -static void ExaEvt_RemoveOldPlayers (void) +static void ExaEvt_RemoveOldParticipants (void) { /***** Delete events not being played by teacher *****/ DB_QueryDELETE ("can not update events as not being played", @@ -3505,8 +3505,8 @@ static void ExaEvt_RemoveOldPlayers (void) " WHERE TSStatus.NumPlayers = - (unsigned) DB_QueryCOUNT ("can not get number of players", + /***** Get number of participants who are playing an exam event *****/ + Event->Status.NumParticipants = + (unsigned) DB_QueryCOUNT ("can not get number of participants", "SELECT COUNT(*) FROM exa_participants" " WHERE EvtCod=%ld", Event->EvtCod); } /*****************************************************************************/ -/******************* Register me as a player in an exam event **********************/ +/************** Register me as a participant in an exam event ****************/ /*****************************************************************************/ // Return true on success -bool ExaEvt_RegisterMeAsPlayerInEvent (struct ExaEvt_Event *Event) +bool ExaEvt_RegisterMeAsParticipantInEvent (struct ExaEvt_Event *Event) { /***** Trivial check: exam event code must be > 0 *****/ if (Event->EvtCod <= 0) return false; /***** Trivial check: exam event must be being played *****/ - if (!Event->Status.Playing) // Event is paused, not being played + if (!Event->Status.Happening) // Event is paused, not being played return false; /***** Trivial check: exam event must not be over *****/ @@ -3594,8 +3594,8 @@ bool ExaEvt_RegisterMeAsPlayerInEvent (struct ExaEvt_Event *Event) if (Gbl.Usrs.Me.Role.Logged != Rol_STD) // I am not logged as student return false; - /***** Insert me as exam event player *****/ - DB_QueryREPLACE ("can not insert exam event player", + /***** Insert me as exam event participant *****/ + DB_QueryREPLACE ("can not insert exam event participant", "REPLACE exa_participants (EvtCod,UsrCod) VALUES (%ld,%ld)", Event->EvtCod,Gbl.Usrs.Me.UsrDat.UsrCod); return true; @@ -3629,7 +3629,7 @@ void ExaEvt_JoinEventAsStd (void) ExaEvt_GetDataOfEventByCod (&Event); /***** Show current exam event status *****/ - HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\""); + HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\""); ExaEvt_ShowMatchStatusForStd (&Event,ExaEvt_CHANGE_STATUS_BY_STUDENT); HTM_DIV_End (); } @@ -3652,14 +3652,14 @@ void ExaEvt_RemoveMyQuestionAnswer (void) /***** Check that teacher's screen is showing answers and question index is the current one being played *****/ - if (Event.Status.Playing && // Event is being played + if (Event.Status.Happening && // Event is being played Event.Status.Showing == ExaEvt_ANSWERS && // Teacher's screen is showing answers QstInd == Event.Status.QstInd) // Removing answer to the current question being played /***** Remove answer to this question *****/ ExaEvt_RemoveMyAnswerToEventQuestion (&Event); /***** Show current exam event status *****/ - HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\""); + HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\""); ExaEvt_ShowMatchStatusForStd (&Event,ExaEvt_CHANGE_STATUS_BY_STUDENT); HTM_DIV_End (); } @@ -3676,10 +3676,10 @@ void ExaEvt_StartCountdown (void) /***** Get countdown parameter ****/ NewCountdown = Par_GetParToLong ("Countdown"); - /***** Remove old players. + /***** Remove old participants. This function must be called by a teacher before getting exam event status. *****/ - ExaEvt_RemoveOldPlayers (); + ExaEvt_RemoveOldParticipants (); /***** Get data of the exam event from database *****/ Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed (); @@ -3707,10 +3707,10 @@ void ExaEvt_RefreshEventTch (void) if (!Gbl.Session.IsOpen) // If session has been closed, do not write anything return; - /***** Remove old players. + /***** Remove old participants. This function must be called by a teacher before getting exam event status. *****/ - ExaEvt_RemoveOldPlayers (); + ExaEvt_RemoveOldParticipants (); /***** Get data of the exam event from database *****/ Event.EvtCod = ExaEvt_GetEvtCodBeingPlayed (); @@ -3719,7 +3719,7 @@ void ExaEvt_RefreshEventTch (void) /***** Update countdown *****/ // If current countdown is < 0 ==> no countdown in progress WhatToRefresh = REFRESH_LEFT; - if (Event.Status.Playing && // Event is being played + if (Event.Status.Happening && // Event is being played Event.Status.Countdown >= 0) // Countdown in progress { /* Decrease countdown */ @@ -3743,11 +3743,11 @@ void ExaEvt_RefreshEventTch (void) switch (WhatToRefresh) { case REFRESH_LEFT: // Refresh only left part - HTM_Txt ("match_left|0|"); // 0 ==> do not evaluate MatJax scripts after updating HTML + HTM_Txt ("exam_event_left|0|"); // 0 ==> do not evaluate MatJax scripts after updating HTML ExaEvt_ShowRefreshablePartTch (&Event); break; case REFRESH_ALL: // Refresh the whole page - HTM_Txt ("exam event|1|"); // 1 ==> evaluate MatJax scripts after updating HTML + HTM_Txt ("exam_event|1|"); // 1 ==> evaluate MatJax scripts after updating HTML ExaEvt_ShowMatchStatusForTch (&Event); break; } @@ -3921,7 +3921,7 @@ void ExaEvt_ReceiveQuestionAnswer (void) } /***** Show current exam event status *****/ - HTM_DIV_Begin ("id=\"exam event\" class=\"EXA_CONT\""); + HTM_DIV_Begin ("id=\"exam_event\" class=\"EXA_CONT\""); ExaEvt_ShowMatchStatusForStd (&Event,ExaEvt_CHANGE_STATUS_BY_STUDENT); HTM_DIV_End (); } diff --git a/swad_exam_event.h b/swad_exam_event.h index e8bc5a698..d630cd740 100644 --- a/swad_exam_event.h +++ b/swad_exam_event.h @@ -68,8 +68,8 @@ struct ExaEvt_Event unsigned NumCols; // Number of columns for answers on teacher's screen bool ShowQstResults; // Show global results of current question while playing bool ShowUsrResults; // Show exam with results of all questions for the student - bool Playing; // Is being played now? - unsigned NumPlayers; + bool Happening; // Is being played now? + unsigned NumParticipants; } Status; // Status related to event playing }; @@ -128,7 +128,7 @@ void ExaEvt_WriteChoiceAnsViewEvent (const struct ExaEvt_Event *Event, const struct Tst_Question *Question, const char *Class,bool ShowResult); -bool ExaEvt_RegisterMeAsPlayerInEvent (struct ExaEvt_Event *Event); +bool ExaEvt_RegisterMeAsParticipantInEvent (struct ExaEvt_Event *Event); void ExaEvt_GetEventBeingPlayed (void); void ExaEvt_JoinEventAsStd (void); diff --git a/swad_exam_result.c b/swad_exam_result.c index 71ab5ac7c..106aec2b6 100644 --- a/swad_exam_result.c +++ b/swad_exam_result.c @@ -949,7 +949,7 @@ static void ExaRes_ShowEvtResults (struct Exa_Exams *Exams, ExaEvt_PutParamsEdit (Exams); break; case Usr_OTHER: - Frm_StartForm (ActSeeOneMchResOth); + Frm_StartForm (ActSeeOneExaEvtResOth); ExaEvt_PutParamsEdit (Exams); Usr_PutParamOtherUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EncryptedUsrCod); break; @@ -1075,8 +1075,8 @@ void ExaRes_ShowOneExaResult (void) ExaEvt_GetAndCheckParameters (&Exams,&Exam,&Event); /***** Pointer to user's data *****/ - MeOrOther = (Gbl.Action.Act == ActSeeOneMchResMe) ? Usr_ME : - Usr_OTHER; + MeOrOther = (Gbl.Action.Act == ActSeeOneExaEvtResMe) ? Usr_ME : + Usr_OTHER; switch (MeOrOther) { case Usr_ME: diff --git a/swad_layout.c b/swad_layout.c index 00cd7f32c..b6b3da5a8 100644 --- a/swad_layout.c +++ b/swad_layout.c @@ -39,6 +39,7 @@ #include "swad_connected.h" #include "swad_database.h" #include "swad_exam_announcement.h" +#include "swad_exam_event.h" #include "swad_firewall.h" #include "swad_follow.h" #include "swad_form.h" @@ -751,16 +752,24 @@ static void Lay_WriteScriptInit (void) { extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES]; bool RefreshConnected; - bool RefreshNewTimeline = false; - bool RefreshMatchStd = false; - bool RefreshMatchTch = false; - bool RefreshLastClicks = false; + bool RefreshLastClicks = false; + bool RefreshNewTimeline = false; + bool RefreshExamEventStd = false; + bool RefreshExamEventTch = false; + bool RefreshMatchStd = false; + bool RefreshMatchTch = false; RefreshConnected = Act_GetBrowserTab (Gbl.Action.Act) == Act_BRW_1ST_TAB && (Gbl.Prefs.SideCols & Lay_SHOW_RIGHT_COLUMN); // Right column visible switch (Gbl.Action.Act) { + /* Last clicks */ + case ActLstClk: + RefreshLastClicks = true; + break; + + /* Timeline */ case ActSeeSocTmlGbl: case ActRcvSocPstGbl: case ActRcvSocComGbl: @@ -770,6 +779,26 @@ static void Lay_WriteScriptInit (void) case ActRemSocComGbl: RefreshNewTimeline = true; break; + + /* Exam event */ + case ActJoiExaEvt: + case ActSeeExaEvtAnsQstStd: + case ActRemExaEvtAnsQstStd: + case ActAnsExaEvtQstStd: + RefreshExamEventStd = true; + break; + case ActNewExaEvt: + case ActResExaEvt: + case ActBckExaEvt: + case ActPlyPauExaEvt: + case ActFwdExaEvt: + case ActChgNumColExaEvt: + case ActChgVisResExaEvtQst: + case ActExaEvtCntDwn: + RefreshExamEventTch = true; + break; + + /* Match */ case ActJoiMch: case ActSeeMchAnsQstStd: case ActRemMchAnsQstStd: @@ -786,9 +815,7 @@ static void Lay_WriteScriptInit (void) case ActMchCntDwn: RefreshMatchTch = true; break; - case ActLstClk: - RefreshLastClicks = true; - break; + default: break; } @@ -797,11 +824,15 @@ static void Lay_WriteScriptInit (void) Dat_WriteScriptMonths (); - if (RefreshNewTimeline) // Refresh new timeline via AJAX + if (RefreshNewTimeline) // Refresh new timeline via AJAX HTM_TxtF ("\tvar delayNewTL = %lu;\n",Cfg_TIME_TO_REFRESH_TIMELINE); - else if (RefreshMatchStd) // Refresh match via AJAX + else if (RefreshExamEventStd) // Refresh exam event via AJAX + HTM_TxtF ("\tvar delayExamEvent = %lu;\n",Cfg_TIME_TO_REFRESH_MATCH_STD); + else if (RefreshExamEventTch) // Refresh exam event via AJAX + HTM_TxtF ("\tvar delayExamEvent = %lu;\n",Cfg_TIME_TO_REFRESH_MATCH_TCH); + else if (RefreshMatchStd) // Refresh match via AJAX HTM_TxtF ("\tvar delayMatch = %lu;\n",Cfg_TIME_TO_REFRESH_MATCH_STD); - else if (RefreshMatchTch) // Refresh match via AJAX + else if (RefreshMatchTch) // Refresh match via AJAX HTM_TxtF ("\tvar delayMatch = %lu;\n",Cfg_TIME_TO_REFRESH_MATCH_TCH); /***** Function init () ******/ @@ -816,15 +847,19 @@ static void Lay_WriteScriptInit (void) Gbl.Usrs.Connected.TimeToRefreshInMs); } - if (RefreshLastClicks) // Refresh last clicks via AJAX + if (RefreshLastClicks) // Refresh last clicks via AJAX HTM_TxtF ("\tsetTimeout(\"refreshLastClicks()\",%lu);\n", Cfg_TIME_TO_REFRESH_LAST_CLICKS); - else if (RefreshMatchStd) // Refresh match for a student via AJAX - HTM_Txt ("\tsetTimeout(\"refreshMatchStd()\",delayMatch);\n"); - else if (RefreshMatchTch) // Refresh match for a teacher via AJAX - HTM_Txt ("\tsetTimeout(\"refreshMatchTch()\",delayMatch);\n"); - else if (RefreshNewTimeline) // Refresh timeline via AJAX + else if (RefreshNewTimeline) // Refresh timeline via AJAX HTM_Txt ("\tsetTimeout(\"refreshNewTL()\",delayNewTL);\n"); + else if (RefreshExamEventStd) // Refresh exam event for a student via AJAX + HTM_Txt ("\tsetTimeout(\"refreshExamEventStd()\",delayExamEvent);\n"); + else if (RefreshExamEventTch) // Refresh exam event for a teacher via AJAX + HTM_Txt ("\tsetTimeout(\"refreshExamEventTch()\",delayExamEvent);\n"); + else if (RefreshMatchStd) // Refresh match for a student via AJAX + HTM_Txt ("\tsetTimeout(\"refreshMatchStd()\",delayMatch);\n"); + else if (RefreshMatchTch) // Refresh match for a teacher via AJAX + HTM_Txt ("\tsetTimeout(\"refreshMatchTch()\",delayMatch);\n"); HTM_Txt ("}\n"); @@ -902,6 +937,34 @@ static void Lay_WriteScriptParamsAJAX (void) Act_GetActCod (ActRefOldSocPubUsr), Gbl.Usrs.Other.UsrDat.EncryptedUsrCod); break; + /* Parameters related with exam event refreshing (for students) */ + case ActJoiExaEvt: + case ActSeeExaEvtAnsQstStd: + case ActRemExaEvtAnsQstStd: + case ActAnsExaEvtQstStd: + // Refresh parameters + HTM_TxtF ("var RefreshParamNxtActExaEvt = \"act=%ld\";\n" + "var RefreshParamExaEvtCod = \"EvtCod=%ld\";\n", + Act_GetActCod (ActRefExaEvtStd), + ExaEvt_GetEvtCodBeingPlayed ()); + break; + /* Parameters related with exam event refreshing (for teachers) */ + case ActNewExaEvt: + case ActResExaEvt: + case ActBckExaEvt: + case ActPlyPauExaEvt: + case ActFwdExaEvt: + case ActChgNumColExaEvt: + case ActChgVisResExaEvtQst: + case ActExaEvtCntDwn: + // Handle keys in keyboard/presenter + HTM_Txt ("document.addEventListener(\"keydown\",handleMatchKeys);\n"); + // Refresh parameters + HTM_TxtF ("var RefreshParamNxtActExaEvt = \"act=%ld\";\n" + "var RefreshParamExaEvtCod = \"EvtCod=%ld\";\n", + Act_GetActCod (ActRefExaEvtTch), + ExaEvt_GetEvtCodBeingPlayed ()); + break; /* Parameters related with match refreshing (for students) */ case ActJoiMch: case ActSeeMchAnsQstStd: