diff --git a/js/swad19.236.4.js b/js/swad19.238.3.js similarity index 99% rename from js/swad19.236.4.js rename to js/swad19.238.3.js index 8680b0df8..ec87ec681 100644 --- a/js/swad19.236.4.js +++ b/js/swad19.238.3.js @@ -550,15 +550,16 @@ function readConnUsrsData () { /*****************************************************************************/ // This function is called when user changes an answer in an exam print -function updateExamPrint (idDiv,idInput,nameInput,Params) { +function updateExamPrint (idDiv,idInput,nameInput,Params,timeoutMsg) { 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 (objXMLHttp.readyState == 4) { // Check if data have been received + if (objXMLHttp.status == 200) { + clearTimeout (xmlHttpTimeout); // Response received ==> clear timeout if (idDiv) { var div = document.getElementById(idDiv); // Access to DIV if (div) { @@ -572,6 +573,8 @@ function updateExamPrint (idDiv,idInput,nameInput,Params) { MathJax.typeset(); } } + } + } }; var inputElem = document.getElementById(idInput); @@ -606,6 +609,16 @@ function updateExamPrint (idDiv,idInput,nameInput,Params) { objXMLHttp.open('POST',ActionAJAX,true); objXMLHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); objXMLHttp.send(Params); + + /* Timeout to abort in 5 seconds. + See https://stackoverflow.com/questions/1018705/how-to-detect-timeout-on-an-ajax-xmlhttprequest-call-in-the-browser + and http://geekswithblogs.net/lorint/archive/2006/03/07/71625.aspx + "ontimeout" based solutions does not work when network disconnects */ + var xmlHttpTimeout = setTimeout (ajaxTimeout,5000); // 5 s + function ajaxTimeout () { + objXMLHttp.abort (); + alert (timeoutMsg); + }; } } diff --git a/swad_changelog.h b/swad_changelog.h index 1e3fb0b7e..9785c65e6 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -557,10 +557,11 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - * En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 19.238.2 (2020-05-18)" +#define Log_PLATFORM_VERSION "SWAD 19.238.3 (2020-05-19)" #define CSS_FILE "swad19.238.2.css" -#define JS_FILE "swad19.236.4.js" +#define JS_FILE "swad19.238.3.js" /* + Version 19.238.3: May 19, 2020 Fixed issue due to network timeout while answering exams. Reported by Nuria Torres Rosell. (301316 lines) Version 19.238.2: May 19, 2020 Exam description is written in exam heading. Suggested by Eva Martínez Ortigosa. (301254 lines) Version 19.238.1: May 19, 2020 Fixed bug: clicks on answers of exam prints are logged. (301566 lines) Version 19.238: May 18, 2020 Fix exam-related details. diff --git a/swad_exam_print.c b/swad_exam_print.c index d952870d8..f3763d3d5 100644 --- a/swad_exam_print.c +++ b/swad_exam_print.c @@ -86,17 +86,22 @@ static void ExaPrn_WriteQstAndAnsToFill (const struct ExaPrn_Print *Print, static void ExaPrn_WriteAnswersToFill (const struct ExaPrn_Print *Print, unsigned NumQst, const struct Tst_Question *Question); +//----------------------------------------------------------------------------- static void ExaPrn_WriteIntAnsToFill (const struct ExaPrn_Print *Print, unsigned NumQst); -static void ExaPrn_WriteFloatAnsToFill (const struct ExaPrn_Print *Print, - unsigned NumQst); -static void ExaPrn_WriteTFAnsToFill (const struct ExaPrn_Print *Print, - unsigned NumQst); -static void ExaPrn_WriteChoiceAnsToFill (const struct ExaPrn_Print *Print, - unsigned NumQst, - const struct Tst_Question *Question); -static void ExaPrn_WriteTextAnsToFill (const struct ExaPrn_Print *Print, - unsigned NumQst); +static void ExaPrn_WriteFloAnsToFill (const struct ExaPrn_Print *Print, + unsigned NumQst); +static void ExaPrn_WriteTF_AnsToFill (const struct ExaPrn_Print *Print, + unsigned NumQst); +static void ExaPrn_WriteChoAnsToFill (const struct ExaPrn_Print *Print, + unsigned NumQst, + const struct Tst_Question *Question); +static void ExaPrn_WriteTxtAnsToFill (const struct ExaPrn_Print *Print, + unsigned NumQst); +//----------------------------------------------------------------------------- +static void ExaPrn_WriteJSToUpdateExamPrint (const struct ExaPrn_Print *Print, + unsigned NumQst, + const char *Id,int NumOpt); static unsigned ExaPrn_GetAnswerFromForm (struct ExaPrn_Print *Print); @@ -736,17 +741,17 @@ static void ExaPrn_WriteAnswersToFill (const struct ExaPrn_Print *Print, ExaPrn_WriteIntAnsToFill (Print,NumQst); break; case Tst_ANS_FLOAT: - ExaPrn_WriteFloatAnsToFill (Print,NumQst); + ExaPrn_WriteFloAnsToFill (Print,NumQst); break; case Tst_ANS_TRUE_FALSE: - ExaPrn_WriteTFAnsToFill (Print,NumQst); + ExaPrn_WriteTF_AnsToFill (Print,NumQst); break; case Tst_ANS_UNIQUE_CHOICE: case Tst_ANS_MULTIPLE_CHOICE: - ExaPrn_WriteChoiceAnsToFill (Print,NumQst,Question); + ExaPrn_WriteChoAnsToFill (Print,NumQst,Question); break; case Tst_ANS_TEXT: - ExaPrn_WriteTextAnsToFill (Print,NumQst); + ExaPrn_WriteTxtAnsToFill (Print,NumQst); break; default: break; @@ -770,19 +775,16 @@ static void ExaPrn_WriteIntAnsToFill (const struct ExaPrn_Print *Print, " size=\"11\" maxlength=\"11\" value=\"%s\"", Id, Print->PrintedQuestions[NumQst].StrAnswers); - HTM_TxtF (" onchange=\"updateExamPrint('examprint','%s','Ans'," - "'act=%ld&ses=%s&SesCod=%ld&NumQst=%u');" - " return false;\" />", // return false is necessary to not submit form - Id, - Act_GetActCod (ActAnsExaPrn),Gbl.Session.Id,Print->SesCod,NumQst); + ExaPrn_WriteJSToUpdateExamPrint (Print,NumQst,Id,-1); + HTM_Txt (" />"); } /*****************************************************************************/ /****************** Write float answer when seeing a test ********************/ /*****************************************************************************/ -static void ExaPrn_WriteFloatAnsToFill (const struct ExaPrn_Print *Print, - unsigned NumQst) +static void ExaPrn_WriteFloAnsToFill (const struct ExaPrn_Print *Print, + unsigned NumQst) { char Id[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x" @@ -794,19 +796,16 @@ static void ExaPrn_WriteFloatAnsToFill (const struct ExaPrn_Print *Print, " size=\"11\" maxlength=\"%u\" value=\"%s\"", Id,Tst_MAX_BYTES_FLOAT_ANSWER, Print->PrintedQuestions[NumQst].StrAnswers); - HTM_TxtF (" onchange=\"updateExamPrint('examprint','%s','Ans'," - "'act=%ld&ses=%s&SesCod=%ld&NumQst=%u');" - " return false;\" />", // return false is necessary to not submit form - Id, - Act_GetActCod (ActAnsExaPrn),Gbl.Session.Id,Print->SesCod,NumQst); + ExaPrn_WriteJSToUpdateExamPrint (Print,NumQst,Id,-1); + HTM_Txt (" />"); } /*****************************************************************************/ /************** Write false / true answer when seeing a test ****************/ /*****************************************************************************/ -static void ExaPrn_WriteTFAnsToFill (const struct ExaPrn_Print *Print, - unsigned NumQst) +static void ExaPrn_WriteTF_AnsToFill (const struct ExaPrn_Print *Print, + unsigned NumQst) { extern const char *Txt_TF_QST[2]; char Id[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x" @@ -819,12 +818,8 @@ static void ExaPrn_WriteTFAnsToFill (const struct ExaPrn_Print *Print, "Ans%010u", NumQst); HTM_TxtF ("