mirror of
https://github.com/acanas/swad-core.git
synced 2024-06-02 14:55:23 +02:00
Version19.229
This commit is contained in:
parent
68a174d4d5
commit
2acc20731a
111
js/swad19.223.js
111
js/swad19.223.js
|
@ -547,117 +547,6 @@ 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/***************** Update exam print main area using AJAX ********************/
|
/***************** Update exam print main area using AJAX ********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -477,13 +477,6 @@ CREATE TABLE IF NOT EXISTS exa_events (
|
||||||
StartTime DATETIME NOT NULL,
|
StartTime DATETIME NOT NULL,
|
||||||
EndTime DATETIME NOT NULL,
|
EndTime DATETIME NOT NULL,
|
||||||
Title VARCHAR(2047) NOT NULL,
|
Title VARCHAR(2047) NOT NULL,
|
||||||
QstInd INT NOT NULL DEFAULT 0,
|
|
||||||
QstCod INT NOT NULL DEFAULT -1,
|
|
||||||
Showing ENUM('start','stem','answers','results','end') NOT NULL DEFAULT 'start',
|
|
||||||
Countdown INT NOT NULL DEFAULT -1,
|
|
||||||
NumCols INT NOT NULL DEFAULT 1,
|
|
||||||
ShowQstResults ENUM('N','Y') NOT NULL DEFAULT 'N',
|
|
||||||
ShowUsrResults ENUM('N','Y') NOT NULL DEFAULT 'N',
|
|
||||||
UNIQUE INDEX(EvtCod),
|
UNIQUE INDEX(EvtCod),
|
||||||
INDEX(ExaCod));
|
INDEX(ExaCod));
|
||||||
--
|
--
|
||||||
|
|
|
@ -688,21 +688,6 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
|
||||||
[ActHidExaEvt ] = {1900,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaEvt_HideEvent ,NULL},
|
[ActHidExaEvt ] = {1900,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaEvt_HideEvent ,NULL},
|
||||||
[ActShoExaEvt ] = {1901,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaEvt_UnhideEvent ,NULL},
|
[ActShoExaEvt ] = {1901,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaEvt_UnhideEvent ,NULL},
|
||||||
|
|
||||||
[ActResExaEvt ] = {1854,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,ExaEvt_GetEventBeingPlayed ,ExaEvt_ResumeEvent ,NULL},
|
|
||||||
[ActBckExaEvt ] = {1855,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,ExaEvt_GetEventBeingPlayed ,ExaEvt_BackEvent ,NULL},
|
|
||||||
[ActPlyPauExaEvt ] = {1856,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,ExaEvt_GetEventBeingPlayed ,ExaEvt_PlayPauseEvent ,NULL},
|
|
||||||
[ActFwdExaEvt ] = {1857,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,ExaEvt_GetEventBeingPlayed ,ExaEvt_ForwardEvent ,NULL},
|
|
||||||
[ActChgNumColExaEvt ] = {1858,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,ExaEvt_GetEventBeingPlayed ,ExaEvt_ChangeNumColsEvt ,NULL},
|
|
||||||
[ActChgVisResExaEvtQst] = {1859,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,ExaEvt_GetEventBeingPlayed ,ExaEvt_ToggleVisibilResultsEvtQst,NULL},
|
|
||||||
[ActExaEvtCntDwn ] = {1860,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_RFRESH,ExaEvt_GetEventBeingPlayed ,ExaEvt_StartCountdown ,NULL},
|
|
||||||
[ActRefExaEvtTch ] = {1861,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_RFRESH,ExaEvt_GetEventBeingPlayed ,ExaEvt_RefreshEventTch ,NULL},
|
|
||||||
|
|
||||||
[ActJoiExaEvt ] = {1862,-1,TabUnk,ActSeeAllExa ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,ExaEvt_GetEventBeingPlayed ,ExaEvt_JoinEventAsStd ,NULL},
|
|
||||||
[ActSeeExaEvtAnsQstStd] = {1863,-1,TabUnk,ActSeeAllExa ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,ExaEvt_GetEventBeingPlayed ,ExaEvt_JoinEventAsStd ,NULL},
|
|
||||||
[ActRemExaEvtAnsQstStd] = {1864,-1,TabUnk,ActSeeAllExa ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,ExaEvt_GetEventBeingPlayed ,ExaEvt_RemoveMyQuestionAnswer ,NULL},
|
|
||||||
[ActAnsExaEvtQstStd ] = {1865,-1,TabUnk,ActSeeAllExa ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,ExaEvt_GetEventBeingPlayed ,ExaEvt_ReceiveQuestionAnswer ,NULL},
|
|
||||||
[ActRefExaEvtStd ] = {1866,-1,TabUnk,ActSeeAllExa ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_RFRESH,ExaEvt_GetEventBeingPlayed ,ExaEvt_RefreshEventStd ,NULL},
|
|
||||||
|
|
||||||
[ActSeeMyExaEvtResCrs] = {1867,-1,TabUnk,ActSeeAllExa ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaRes_ShowMyExaResultsInCrs ,NULL},
|
[ActSeeMyExaEvtResCrs] = {1867,-1,TabUnk,ActSeeAllExa ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaRes_ShowMyExaResultsInCrs ,NULL},
|
||||||
[ActSeeMyExaEvtResExa] = {1868,-1,TabUnk,ActSeeAllExa ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaRes_ShowMyExaResultsInExa ,NULL},
|
[ActSeeMyExaEvtResExa] = {1868,-1,TabUnk,ActSeeAllExa ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaRes_ShowMyExaResultsInExa ,NULL},
|
||||||
[ActSeeMyExaEvtResEvt] = {1869,-1,TabUnk,ActSeeAllExa ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaRes_ShowMyExaResultsInEvt ,NULL},
|
[ActSeeMyExaEvtResEvt] = {1869,-1,TabUnk,ActSeeAllExa ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaRes_ShowMyExaResultsInEvt ,NULL},
|
||||||
|
@ -3675,19 +3660,19 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
|
||||||
ActRemExaEvt, // #1851
|
ActRemExaEvt, // #1851
|
||||||
ActReqNewExaEvt, // #1852
|
ActReqNewExaEvt, // #1852
|
||||||
ActNewExaEvt, // #1853
|
ActNewExaEvt, // #1853
|
||||||
ActResExaEvt, // #1854
|
-1, // #1854 (obsolete action)
|
||||||
ActBckExaEvt, // #1855
|
-1, // #1855 (obsolete action)
|
||||||
ActPlyPauExaEvt, // #1856
|
-1, // #1856 (obsolete action)
|
||||||
ActFwdExaEvt, // #1857
|
-1, // #1857 (obsolete action)
|
||||||
ActChgNumColExaEvt, // #1858
|
-1, // #1858 (obsolete action)
|
||||||
ActChgVisResExaEvtQst, // #1859
|
-1, // #1859 (obsolete action)
|
||||||
ActExaEvtCntDwn, // #1860
|
-1, // #1860 (obsolete action)
|
||||||
ActRefExaEvtTch, // #1861
|
-1, // #1861 (obsolete action)
|
||||||
ActJoiExaEvt, // #1862
|
-1, // #1862 (obsolete action)
|
||||||
ActSeeExaEvtAnsQstStd, // #1863
|
-1, // #1863 (obsolete action)
|
||||||
ActRemExaEvtAnsQstStd, // #1864
|
-1, // #1864 (obsolete action)
|
||||||
ActAnsExaEvtQstStd, // #1865
|
-1, // #1865 (obsolete action)
|
||||||
ActRefExaEvtStd, // #1866
|
-1, // #1866 (obsolete action)
|
||||||
ActSeeMyExaEvtResCrs, // #1867
|
ActSeeMyExaEvtResCrs, // #1867
|
||||||
ActSeeMyExaEvtResExa, // #1868
|
ActSeeMyExaEvtResExa, // #1868
|
||||||
ActSeeMyExaEvtResEvt, // #1869
|
ActSeeMyExaEvtResEvt, // #1869
|
||||||
|
|
218
swad_action.h
218
swad_action.h
|
@ -654,135 +654,121 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
|
||||||
#define ActHidExaEvt (ActChgCrsTT1stDay + 130)
|
#define ActHidExaEvt (ActChgCrsTT1stDay + 130)
|
||||||
#define ActShoExaEvt (ActChgCrsTT1stDay + 131)
|
#define ActShoExaEvt (ActChgCrsTT1stDay + 131)
|
||||||
|
|
||||||
#define ActResExaEvt (ActChgCrsTT1stDay + 132)
|
#define ActSeeMyExaEvtResCrs (ActChgCrsTT1stDay + 132)
|
||||||
#define ActBckExaEvt (ActChgCrsTT1stDay + 133)
|
#define ActSeeMyExaEvtResExa (ActChgCrsTT1stDay + 133)
|
||||||
#define ActPlyPauExaEvt (ActChgCrsTT1stDay + 134)
|
#define ActSeeMyExaEvtResEvt (ActChgCrsTT1stDay + 134)
|
||||||
#define ActFwdExaEvt (ActChgCrsTT1stDay + 135)
|
#define ActSeeOneExaEvtResMe (ActChgCrsTT1stDay + 135)
|
||||||
#define ActChgNumColExaEvt (ActChgCrsTT1stDay + 136)
|
|
||||||
#define ActChgVisResExaEvtQst (ActChgCrsTT1stDay + 137)
|
|
||||||
#define ActExaEvtCntDwn (ActChgCrsTT1stDay + 138)
|
|
||||||
#define ActRefExaEvtTch (ActChgCrsTT1stDay + 139)
|
|
||||||
#define ActJoiExaEvt (ActChgCrsTT1stDay + 140)
|
|
||||||
#define ActSeeExaEvtAnsQstStd (ActChgCrsTT1stDay + 141)
|
|
||||||
#define ActRemExaEvtAnsQstStd (ActChgCrsTT1stDay + 142)
|
|
||||||
#define ActAnsExaEvtQstStd (ActChgCrsTT1stDay + 143)
|
|
||||||
#define ActRefExaEvtStd (ActChgCrsTT1stDay + 144)
|
|
||||||
|
|
||||||
#define ActSeeMyExaEvtResCrs (ActChgCrsTT1stDay + 145)
|
#define ActReqSeeAllExaEvtRes (ActChgCrsTT1stDay + 136)
|
||||||
#define ActSeeMyExaEvtResExa (ActChgCrsTT1stDay + 146)
|
#define ActSeeAllExaEvtResCrs (ActChgCrsTT1stDay + 137)
|
||||||
#define ActSeeMyExaEvtResEvt (ActChgCrsTT1stDay + 147)
|
#define ActSeeAllExaEvtResExa (ActChgCrsTT1stDay + 138)
|
||||||
#define ActSeeOneExaEvtResMe (ActChgCrsTT1stDay + 148)
|
#define ActSeeAllExaEvtResEvt (ActChgCrsTT1stDay + 139)
|
||||||
|
#define ActSeeOneExaEvtResOth (ActChgCrsTT1stDay + 140)
|
||||||
|
|
||||||
#define ActReqSeeAllExaEvtRes (ActChgCrsTT1stDay + 149)
|
#define ActChgVisResExaEvtUsr (ActChgCrsTT1stDay + 141)
|
||||||
#define ActSeeAllExaEvtResCrs (ActChgCrsTT1stDay + 150)
|
|
||||||
#define ActSeeAllExaEvtResExa (ActChgCrsTT1stDay + 151)
|
|
||||||
#define ActSeeAllExaEvtResEvt (ActChgCrsTT1stDay + 152)
|
|
||||||
#define ActSeeOneExaEvtResOth (ActChgCrsTT1stDay + 153)
|
|
||||||
|
|
||||||
#define ActChgVisResExaEvtUsr (ActChgCrsTT1stDay + 154)
|
#define ActFrmNewExa (ActChgCrsTT1stDay + 142)
|
||||||
|
#define ActEdiOneExa (ActChgCrsTT1stDay + 143)
|
||||||
|
#define ActNewExa (ActChgCrsTT1stDay + 144)
|
||||||
|
#define ActChgExa (ActChgCrsTT1stDay + 145)
|
||||||
|
#define ActReqRemExa (ActChgCrsTT1stDay + 146)
|
||||||
|
#define ActRemExa (ActChgCrsTT1stDay + 147)
|
||||||
|
#define ActHidExa (ActChgCrsTT1stDay + 148)
|
||||||
|
#define ActShoExa (ActChgCrsTT1stDay + 149)
|
||||||
|
#define ActFrmNewExaSet (ActChgCrsTT1stDay + 150)
|
||||||
|
#define ActNewExaSet (ActChgCrsTT1stDay + 151)
|
||||||
|
#define ActReqRemExaSet (ActChgCrsTT1stDay + 152)
|
||||||
|
#define ActRemExaSet (ActChgCrsTT1stDay + 153)
|
||||||
|
#define ActUp_ExaSet (ActChgCrsTT1stDay + 154)
|
||||||
|
#define ActDwnExaSet (ActChgCrsTT1stDay + 155)
|
||||||
|
#define ActChgTitExaSet (ActChgCrsTT1stDay + 156)
|
||||||
|
#define ActChgNumQstExaSet (ActChgCrsTT1stDay + 157)
|
||||||
|
|
||||||
#define ActFrmNewExa (ActChgCrsTT1stDay + 155)
|
#define ActReqAddQstExaSet (ActChgCrsTT1stDay + 158)
|
||||||
#define ActEdiOneExa (ActChgCrsTT1stDay + 156)
|
#define ActLstTstQstForSet (ActChgCrsTT1stDay + 159)
|
||||||
#define ActNewExa (ActChgCrsTT1stDay + 157)
|
#define ActAddQstToExa (ActChgCrsTT1stDay + 160)
|
||||||
#define ActChgExa (ActChgCrsTT1stDay + 158)
|
#define ActReqRemSetQst (ActChgCrsTT1stDay + 161)
|
||||||
#define ActReqRemExa (ActChgCrsTT1stDay + 159)
|
#define ActRemExaQst (ActChgCrsTT1stDay + 162)
|
||||||
#define ActRemExa (ActChgCrsTT1stDay + 160)
|
|
||||||
#define ActHidExa (ActChgCrsTT1stDay + 161)
|
|
||||||
#define ActShoExa (ActChgCrsTT1stDay + 162)
|
|
||||||
#define ActFrmNewExaSet (ActChgCrsTT1stDay + 163)
|
|
||||||
#define ActNewExaSet (ActChgCrsTT1stDay + 164)
|
|
||||||
#define ActReqRemExaSet (ActChgCrsTT1stDay + 165)
|
|
||||||
#define ActRemExaSet (ActChgCrsTT1stDay + 166)
|
|
||||||
#define ActUp_ExaSet (ActChgCrsTT1stDay + 167)
|
|
||||||
#define ActDwnExaSet (ActChgCrsTT1stDay + 168)
|
|
||||||
#define ActChgTitExaSet (ActChgCrsTT1stDay + 169)
|
|
||||||
#define ActChgNumQstExaSet (ActChgCrsTT1stDay + 170)
|
|
||||||
|
|
||||||
#define ActReqAddQstExaSet (ActChgCrsTT1stDay + 171)
|
#define ActSeeExaPrn (ActChgCrsTT1stDay + 163)
|
||||||
#define ActLstTstQstForSet (ActChgCrsTT1stDay + 172)
|
#define ActAnsExaPrn (ActChgCrsTT1stDay + 164)
|
||||||
#define ActAddQstToExa (ActChgCrsTT1stDay + 173)
|
#define ActEndExaPrn (ActChgCrsTT1stDay + 165)
|
||||||
#define ActReqRemSetQst (ActChgCrsTT1stDay + 174)
|
|
||||||
#define ActRemExaQst (ActChgCrsTT1stDay + 175)
|
|
||||||
|
|
||||||
#define ActSeeExaPrn (ActChgCrsTT1stDay + 176)
|
#define ActSeeGam (ActChgCrsTT1stDay + 166)
|
||||||
#define ActAnsExaPrn (ActChgCrsTT1stDay + 177)
|
#define ActReqRemMch (ActChgCrsTT1stDay + 167)
|
||||||
#define ActEndExaPrn (ActChgCrsTT1stDay + 178)
|
#define ActRemMch (ActChgCrsTT1stDay + 168)
|
||||||
|
#define ActReqNewMch (ActChgCrsTT1stDay + 169)
|
||||||
|
#define ActNewMch (ActChgCrsTT1stDay + 170)
|
||||||
|
#define ActResMch (ActChgCrsTT1stDay + 171)
|
||||||
|
#define ActBckMch (ActChgCrsTT1stDay + 172)
|
||||||
|
#define ActPlyPauMch (ActChgCrsTT1stDay + 173)
|
||||||
|
#define ActFwdMch (ActChgCrsTT1stDay + 174)
|
||||||
|
#define ActChgNumColMch (ActChgCrsTT1stDay + 175)
|
||||||
|
#define ActChgVisResMchQst (ActChgCrsTT1stDay + 176)
|
||||||
|
#define ActMchCntDwn (ActChgCrsTT1stDay + 177)
|
||||||
|
#define ActRefMchTch (ActChgCrsTT1stDay + 178)
|
||||||
|
|
||||||
#define ActSeeGam (ActChgCrsTT1stDay + 179)
|
#define ActJoiMch (ActChgCrsTT1stDay + 179)
|
||||||
#define ActReqRemMch (ActChgCrsTT1stDay + 180)
|
#define ActSeeMchAnsQstStd (ActChgCrsTT1stDay + 180)
|
||||||
#define ActRemMch (ActChgCrsTT1stDay + 181)
|
#define ActRemMchAnsQstStd (ActChgCrsTT1stDay + 181)
|
||||||
#define ActReqNewMch (ActChgCrsTT1stDay + 182)
|
#define ActAnsMchQstStd (ActChgCrsTT1stDay + 182)
|
||||||
#define ActNewMch (ActChgCrsTT1stDay + 183)
|
#define ActRefMchStd (ActChgCrsTT1stDay + 183)
|
||||||
#define ActResMch (ActChgCrsTT1stDay + 184)
|
|
||||||
#define ActBckMch (ActChgCrsTT1stDay + 185)
|
|
||||||
#define ActPlyPauMch (ActChgCrsTT1stDay + 186)
|
|
||||||
#define ActFwdMch (ActChgCrsTT1stDay + 187)
|
|
||||||
#define ActChgNumColMch (ActChgCrsTT1stDay + 188)
|
|
||||||
#define ActChgVisResMchQst (ActChgCrsTT1stDay + 189)
|
|
||||||
#define ActMchCntDwn (ActChgCrsTT1stDay + 190)
|
|
||||||
#define ActRefMchTch (ActChgCrsTT1stDay + 191)
|
|
||||||
|
|
||||||
#define ActJoiMch (ActChgCrsTT1stDay + 192)
|
#define ActSeeMyMchResCrs (ActChgCrsTT1stDay + 184)
|
||||||
#define ActSeeMchAnsQstStd (ActChgCrsTT1stDay + 193)
|
#define ActSeeMyMchResGam (ActChgCrsTT1stDay + 185)
|
||||||
#define ActRemMchAnsQstStd (ActChgCrsTT1stDay + 194)
|
#define ActSeeMyMchResMch (ActChgCrsTT1stDay + 186)
|
||||||
#define ActAnsMchQstStd (ActChgCrsTT1stDay + 195)
|
#define ActSeeOneMchResMe (ActChgCrsTT1stDay + 187)
|
||||||
#define ActRefMchStd (ActChgCrsTT1stDay + 196)
|
|
||||||
|
|
||||||
#define ActSeeMyMchResCrs (ActChgCrsTT1stDay + 197)
|
#define ActReqSeeAllMchRes (ActChgCrsTT1stDay + 188)
|
||||||
#define ActSeeMyMchResGam (ActChgCrsTT1stDay + 198)
|
#define ActSeeAllMchResCrs (ActChgCrsTT1stDay + 189)
|
||||||
#define ActSeeMyMchResMch (ActChgCrsTT1stDay + 199)
|
#define ActSeeAllMchResGam (ActChgCrsTT1stDay + 190)
|
||||||
#define ActSeeOneMchResMe (ActChgCrsTT1stDay + 200)
|
#define ActSeeAllMchResMch (ActChgCrsTT1stDay + 191)
|
||||||
|
#define ActSeeOneMchResOth (ActChgCrsTT1stDay + 192)
|
||||||
|
|
||||||
#define ActReqSeeAllMchRes (ActChgCrsTT1stDay + 201)
|
#define ActChgVisResMchUsr (ActChgCrsTT1stDay + 193)
|
||||||
#define ActSeeAllMchResCrs (ActChgCrsTT1stDay + 202)
|
|
||||||
#define ActSeeAllMchResGam (ActChgCrsTT1stDay + 203)
|
|
||||||
#define ActSeeAllMchResMch (ActChgCrsTT1stDay + 204)
|
|
||||||
#define ActSeeOneMchResOth (ActChgCrsTT1stDay + 205)
|
|
||||||
|
|
||||||
#define ActChgVisResMchUsr (ActChgCrsTT1stDay + 206)
|
#define ActFrmNewGam (ActChgCrsTT1stDay + 194)
|
||||||
|
#define ActEdiOneGam (ActChgCrsTT1stDay + 195)
|
||||||
|
#define ActNewGam (ActChgCrsTT1stDay + 196)
|
||||||
|
#define ActChgGam (ActChgCrsTT1stDay + 197)
|
||||||
|
#define ActReqRemGam (ActChgCrsTT1stDay + 198)
|
||||||
|
#define ActRemGam (ActChgCrsTT1stDay + 199)
|
||||||
|
#define ActHidGam (ActChgCrsTT1stDay + 200)
|
||||||
|
#define ActShoGam (ActChgCrsTT1stDay + 201)
|
||||||
|
#define ActAddOneGamQst (ActChgCrsTT1stDay + 202)
|
||||||
|
#define ActGamLstTstQst (ActChgCrsTT1stDay + 203)
|
||||||
|
#define ActAddTstQstToGam (ActChgCrsTT1stDay + 204)
|
||||||
|
#define ActReqRemGamQst (ActChgCrsTT1stDay + 205)
|
||||||
|
#define ActRemGamQst (ActChgCrsTT1stDay + 206)
|
||||||
|
#define ActUp_GamQst (ActChgCrsTT1stDay + 207)
|
||||||
|
#define ActDwnGamQst (ActChgCrsTT1stDay + 208)
|
||||||
|
|
||||||
#define ActFrmNewGam (ActChgCrsTT1stDay + 207)
|
#define ActSeeSvy (ActChgCrsTT1stDay + 209)
|
||||||
#define ActEdiOneGam (ActChgCrsTT1stDay + 208)
|
#define ActAnsSvy (ActChgCrsTT1stDay + 210)
|
||||||
#define ActNewGam (ActChgCrsTT1stDay + 209)
|
#define ActFrmNewSvy (ActChgCrsTT1stDay + 211)
|
||||||
#define ActChgGam (ActChgCrsTT1stDay + 210)
|
#define ActEdiOneSvy (ActChgCrsTT1stDay + 212)
|
||||||
#define ActReqRemGam (ActChgCrsTT1stDay + 211)
|
#define ActNewSvy (ActChgCrsTT1stDay + 213)
|
||||||
#define ActRemGam (ActChgCrsTT1stDay + 212)
|
#define ActChgSvy (ActChgCrsTT1stDay + 214)
|
||||||
#define ActHidGam (ActChgCrsTT1stDay + 213)
|
#define ActReqRemSvy (ActChgCrsTT1stDay + 215)
|
||||||
#define ActShoGam (ActChgCrsTT1stDay + 214)
|
#define ActRemSvy (ActChgCrsTT1stDay + 216)
|
||||||
#define ActAddOneGamQst (ActChgCrsTT1stDay + 215)
|
#define ActReqRstSvy (ActChgCrsTT1stDay + 217)
|
||||||
#define ActGamLstTstQst (ActChgCrsTT1stDay + 216)
|
#define ActRstSvy (ActChgCrsTT1stDay + 218)
|
||||||
#define ActAddTstQstToGam (ActChgCrsTT1stDay + 217)
|
#define ActHidSvy (ActChgCrsTT1stDay + 219)
|
||||||
#define ActReqRemGamQst (ActChgCrsTT1stDay + 218)
|
#define ActShoSvy (ActChgCrsTT1stDay + 220)
|
||||||
#define ActRemGamQst (ActChgCrsTT1stDay + 219)
|
#define ActEdiOneSvyQst (ActChgCrsTT1stDay + 221)
|
||||||
#define ActUp_GamQst (ActChgCrsTT1stDay + 220)
|
#define ActRcvSvyQst (ActChgCrsTT1stDay + 222)
|
||||||
#define ActDwnGamQst (ActChgCrsTT1stDay + 221)
|
#define ActReqRemSvyQst (ActChgCrsTT1stDay + 223)
|
||||||
|
#define ActRemSvyQst (ActChgCrsTT1stDay + 224)
|
||||||
|
|
||||||
#define ActSeeSvy (ActChgCrsTT1stDay + 222)
|
#define ActSeeOneExaAnn (ActChgCrsTT1stDay + 225)
|
||||||
#define ActAnsSvy (ActChgCrsTT1stDay + 223)
|
#define ActSeeDatExaAnn (ActChgCrsTT1stDay + 226)
|
||||||
#define ActFrmNewSvy (ActChgCrsTT1stDay + 224)
|
#define ActEdiExaAnn (ActChgCrsTT1stDay + 227)
|
||||||
#define ActEdiOneSvy (ActChgCrsTT1stDay + 225)
|
#define ActRcvExaAnn (ActChgCrsTT1stDay + 228)
|
||||||
#define ActNewSvy (ActChgCrsTT1stDay + 226)
|
#define ActPrnExaAnn (ActChgCrsTT1stDay + 229)
|
||||||
#define ActChgSvy (ActChgCrsTT1stDay + 227)
|
#define ActReqRemExaAnn (ActChgCrsTT1stDay + 230)
|
||||||
#define ActReqRemSvy (ActChgCrsTT1stDay + 228)
|
#define ActRemExaAnn (ActChgCrsTT1stDay + 231)
|
||||||
#define ActRemSvy (ActChgCrsTT1stDay + 229)
|
#define ActHidExaAnn (ActChgCrsTT1stDay + 232)
|
||||||
#define ActReqRstSvy (ActChgCrsTT1stDay + 230)
|
#define ActShoExaAnn (ActChgCrsTT1stDay + 233)
|
||||||
#define ActRstSvy (ActChgCrsTT1stDay + 231)
|
|
||||||
#define ActHidSvy (ActChgCrsTT1stDay + 232)
|
|
||||||
#define ActShoSvy (ActChgCrsTT1stDay + 233)
|
|
||||||
#define ActEdiOneSvyQst (ActChgCrsTT1stDay + 234)
|
|
||||||
#define ActRcvSvyQst (ActChgCrsTT1stDay + 235)
|
|
||||||
#define ActReqRemSvyQst (ActChgCrsTT1stDay + 236)
|
|
||||||
#define ActRemSvyQst (ActChgCrsTT1stDay + 237)
|
|
||||||
|
|
||||||
#define ActSeeOneExaAnn (ActChgCrsTT1stDay + 238)
|
|
||||||
#define ActSeeDatExaAnn (ActChgCrsTT1stDay + 239)
|
|
||||||
#define ActEdiExaAnn (ActChgCrsTT1stDay + 240)
|
|
||||||
#define ActRcvExaAnn (ActChgCrsTT1stDay + 241)
|
|
||||||
#define ActPrnExaAnn (ActChgCrsTT1stDay + 242)
|
|
||||||
#define ActReqRemExaAnn (ActChgCrsTT1stDay + 243)
|
|
||||||
#define ActRemExaAnn (ActChgCrsTT1stDay + 244)
|
|
||||||
#define ActHidExaAnn (ActChgCrsTT1stDay + 245)
|
|
||||||
#define ActShoExaAnn (ActChgCrsTT1stDay + 246)
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******************************** Files tab **********************************/
|
/******************************** Files tab **********************************/
|
||||||
|
|
|
@ -548,10 +548,14 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
|
||||||
En OpenSWAD:
|
En OpenSWAD:
|
||||||
ps2pdf source.ps destination.pdf
|
ps2pdf source.ps destination.pdf
|
||||||
*/
|
*/
|
||||||
#define Log_PLATFORM_VERSION "SWAD 19.228.2 (2020-05-13)"
|
#define Log_PLATFORM_VERSION "SWAD 19.229 (2020-05-13)"
|
||||||
#define CSS_FILE "swad19.217.css"
|
#define CSS_FILE "swad19.217.css"
|
||||||
#define JS_FILE "swad19.223.js"
|
#define JS_FILE "swad19.223.js"
|
||||||
/*
|
/*
|
||||||
|
Version 19.229: May 13, 2020 Removed unused code in exam events. (301163 lines)
|
||||||
|
1 change necessary in database:
|
||||||
|
ALTER TABLE exa_events DROP COLUMN QstInd,DROP COLUMN QstCod,DROP COLUMN Showing,DROP COLUMN Countdown,DROP COLUMN NumCols,DROP COLUMN ShowQstResults;
|
||||||
|
|
||||||
Version 19.228.2: May 13, 2020 Code refactoring in exam prints. (303829 lines)
|
Version 19.228.2: May 13, 2020 Code refactoring in exam prints. (303829 lines)
|
||||||
Version 19.228.1: May 13, 2020 Code refactoring in exam prints. (303828 lines)
|
Version 19.228.1: May 13, 2020 Code refactoring in exam prints. (303828 lines)
|
||||||
Version 19.228: May 13, 2020 Code refactoring and bug fixing in exam prints. (303837 lines)
|
Version 19.228: May 13, 2020 Code refactoring and bug fixing in exam prints. (303837 lines)
|
||||||
|
|
|
@ -1040,25 +1040,19 @@ mysql> DESCRIBE exa_groups;
|
||||||
/***** Table exa_events *****/
|
/***** Table exa_events *****/
|
||||||
/*
|
/*
|
||||||
mysql> DESCRIBE exa_events;
|
mysql> DESCRIBE exa_events;
|
||||||
+----------------+------------------------------------------------+------+-----+---------+----------------+
|
+----------------+---------------+------+-----+---------+----------------+
|
||||||
| Field | Type | Null | Key | Default | Extra |
|
| Field | Type | Null | Key | Default | Extra |
|
||||||
+----------------+------------------------------------------------+------+-----+---------+----------------+
|
+----------------+---------------+------+-----+---------+----------------+
|
||||||
| EvtCod | int(11) | NO | PRI | NULL | auto_increment |
|
| EvtCod | int(11) | NO | PRI | NULL | auto_increment |
|
||||||
| ExaCod | int(11) | NO | MUL | NULL | |
|
| ExaCod | int(11) | NO | MUL | NULL | |
|
||||||
| Hidden | enum('N','Y') | NO | | N | |
|
| Hidden | enum('N','Y') | NO | | N | |
|
||||||
| UsrCod | int(11) | NO | | NULL | |
|
| UsrCod | int(11) | NO | | NULL | |
|
||||||
| StartTime | datetime | NO | | NULL | |
|
| StartTime | datetime | NO | | NULL | |
|
||||||
| EndTime | datetime | NO | | NULL | |
|
| EndTime | datetime | NO | | NULL | |
|
||||||
| Title | varchar(2047) | NO | | NULL | |
|
| Title | varchar(2047) | NO | | NULL | |
|
||||||
| QstInd | int(11) | NO | | 0 | |
|
| ShowUsrResults | enum('N','Y') | NO | | N | |
|
||||||
| QstCod | int(11) | NO | | -1 | |
|
+----------------+---------------+------+-----+---------+----------------+
|
||||||
| Showing | enum('start','stem','answers','results','end') | NO | | start | |
|
8 rows in set (0.00 sec)
|
||||||
| Countdown | int(11) | NO | | -1 | |
|
|
||||||
| NumCols | int(11) | NO | | 1 | |
|
|
||||||
| ShowQstResults | enum('N','Y') | NO | | N | |
|
|
||||||
| ShowUsrResults | enum('N','Y') | NO | | N | |
|
|
||||||
+----------------+------------------------------------------------+------+-----+---------+----------------+
|
|
||||||
14 rows in set (0.00 sec)
|
|
||||||
*/
|
*/
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS exa_events ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS exa_events ("
|
||||||
"EvtCod INT NOT NULL AUTO_INCREMENT,"
|
"EvtCod INT NOT NULL AUTO_INCREMENT,"
|
||||||
|
@ -1068,12 +1062,6 @@ mysql> DESCRIBE exa_events;
|
||||||
"StartTime DATETIME NOT NULL,"
|
"StartTime DATETIME NOT NULL,"
|
||||||
"EndTime DATETIME NOT NULL,"
|
"EndTime DATETIME NOT NULL,"
|
||||||
"Title VARCHAR(2047) NOT NULL," // ExaEvt_MAX_BYTES_TITLE
|
"Title VARCHAR(2047) NOT NULL," // ExaEvt_MAX_BYTES_TITLE
|
||||||
"QstInd INT NOT NULL DEFAULT 0,"
|
|
||||||
"QstCod INT NOT NULL DEFAULT -1,"
|
|
||||||
"Showing ENUM('start','stem','answers','results','end') NOT NULL DEFAULT 'start',"
|
|
||||||
"Countdown INT NOT NULL DEFAULT -1,"
|
|
||||||
"NumCols INT NOT NULL DEFAULT 1,"
|
|
||||||
"ShowQstResults ENUM('N','Y') NOT NULL DEFAULT 'N',"
|
|
||||||
"ShowUsrResults ENUM('N','Y') NOT NULL DEFAULT 'N',"
|
"ShowUsrResults ENUM('N','Y') NOT NULL DEFAULT 'N',"
|
||||||
"UNIQUE INDEX(EvtCod),"
|
"UNIQUE INDEX(EvtCod),"
|
||||||
"INDEX(ExaCod))");
|
"INDEX(ExaCod))");
|
||||||
|
|
2677
swad_exam_event.c
2677
swad_exam_event.c
File diff suppressed because it is too large
Load Diff
|
@ -48,8 +48,6 @@ struct ExaEvt_UsrAnswer
|
||||||
/***************************** Public prototypes *****************************/
|
/***************************** Public prototypes *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
long ExaEvt_GetEvtCodBeingPlayed (void);
|
|
||||||
|
|
||||||
void ExaEvt_ResetEvent (struct ExaEvt_Event *Event);
|
void ExaEvt_ResetEvent (struct ExaEvt_Event *Event);
|
||||||
|
|
||||||
void ExaEvt_ListEvents (struct Exa_Exams *Exams,
|
void ExaEvt_ListEvents (struct Exa_Exams *Exams,
|
||||||
|
@ -79,44 +77,16 @@ long ExaEvt_GetParamEvtCod (void);
|
||||||
void ExaEvt_PutButtonNewEvent (struct Exa_Exams *Exams,long ExaCod);
|
void ExaEvt_PutButtonNewEvent (struct Exa_Exams *Exams,long ExaCod);
|
||||||
void ExaEvt_RequestCreatOrEditEvent (void);
|
void ExaEvt_RequestCreatOrEditEvent (void);
|
||||||
void ExaEvt_ReceiveFormEvent (void);
|
void ExaEvt_ReceiveFormEvent (void);
|
||||||
void ExaEvt_ResumeEvent (void);
|
|
||||||
void ExaEvt_GetIndexes (long EvtCod,unsigned QstInd,
|
|
||||||
unsigned Indexes[Tst_MAX_OPTIONS_PER_QUESTION]);
|
|
||||||
|
|
||||||
void ExaEvt_RemoveGroup (long GrpCod);
|
void ExaEvt_RemoveGroup (long GrpCod);
|
||||||
void ExaEvt_RemoveGroupsOfType (long GrpTypCod);
|
void ExaEvt_RemoveGroupsOfType (long GrpTypCod);
|
||||||
|
|
||||||
void ExaEvt_PlayPauseEvent (void);
|
|
||||||
void ExaEvt_ChangeNumColsEvt (void);
|
|
||||||
void ExaEvt_ToggleVisibilResultsEvtQst (void);
|
|
||||||
void ExaEvt_BackEvent (void);
|
|
||||||
void ExaEvt_ForwardEvent (void);
|
|
||||||
|
|
||||||
unsigned ExaEvt_GetNumEventsInExam (long ExaCod);
|
unsigned ExaEvt_GetNumEventsInExam (long ExaCod);
|
||||||
unsigned ExaEvt_GetNumOpenEventsInExam (long ExaCod);
|
unsigned ExaEvt_GetNumOpenEventsInExam (long ExaCod);
|
||||||
|
|
||||||
bool ExaEvt_CheckIfICanPlayThisEventBasedOnGrps (const struct ExaEvt_Event *Event);
|
bool ExaEvt_CheckIfICanPlayThisEventBasedOnGrps (const struct ExaEvt_Event *Event);
|
||||||
|
|
||||||
void ExaEvt_WriteChoiceAnsViewEvent (const struct ExaEvt_Event *Event,
|
|
||||||
const struct Tst_Question *Question,
|
|
||||||
const char *Class,bool ShowResult);
|
|
||||||
|
|
||||||
bool ExaEvt_RegisterMeAsParticipantInEvent (struct ExaEvt_Event *Event);
|
|
||||||
|
|
||||||
void ExaEvt_GetEventBeingPlayed (void);
|
|
||||||
void ExaEvt_JoinEventAsStd (void);
|
|
||||||
void ExaEvt_RemoveMyQuestionAnswer (void);
|
|
||||||
|
|
||||||
void ExaEvt_StartCountdown (void);
|
|
||||||
void ExaEvt_RefreshEventTch (void);
|
|
||||||
void ExaEvt_RefreshEventStd (void);
|
|
||||||
|
|
||||||
void ExaEvt_GetQstAnsFromDB (long EvtCod,long UsrCod,unsigned QstInd,
|
void ExaEvt_GetQstAnsFromDB (long EvtCod,long UsrCod,unsigned QstInd,
|
||||||
struct ExaEvt_UsrAnswer *UsrAnswer);
|
struct ExaEvt_UsrAnswer *UsrAnswer);
|
||||||
void ExaEvt_ReceiveQuestionAnswer (void);
|
|
||||||
|
|
||||||
unsigned ExaEvt_GetNumUsrsWhoAnsweredQst (long EvtCod,unsigned QstInd);
|
|
||||||
unsigned ExaEvt_GetNumUsrsWhoHaveChosenAns (long EvtCod,unsigned QstInd,unsigned AnsInd);
|
|
||||||
void ExaEvt_DrawBarNumUsrs (unsigned NumRespondersAns,unsigned NumRespondersQst,bool Correct);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1444,7 +1444,7 @@ static bool ExaRes_CheckIfICanSeeEventResult (struct ExaEvt_Event *Event,long Us
|
||||||
{
|
{
|
||||||
case Rol_STD:
|
case Rol_STD:
|
||||||
ItsMe = Usr_ItsMe (UsrCod);
|
ItsMe = Usr_ItsMe (UsrCod);
|
||||||
if (ItsMe && Event->Status.ShowUsrResults)
|
if (ItsMe && Event->ShowUsrResults)
|
||||||
return ExaEvt_CheckIfICanPlayThisEventBasedOnGrps (Event);
|
return ExaEvt_CheckIfICanPlayThisEventBasedOnGrps (Event);
|
||||||
return false;
|
return false;
|
||||||
case Rol_NET:
|
case Rol_NET:
|
||||||
|
|
|
@ -127,17 +127,6 @@ struct ExaSet_Set
|
||||||
char Title[ExaSet_MAX_BYTES_TITLE + 1]; // Title of the set
|
char Title[ExaSet_MAX_BYTES_TITLE + 1]; // Title of the set
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ExaEvt_NUM_SHOWING 5
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
ExaEvt_START, // Start: don't show anything
|
|
||||||
ExaEvt_STEM, // Showing only the question stem
|
|
||||||
ExaEvt_ANSWERS, // Showing the question stem and the answers
|
|
||||||
ExaEvt_RESULTS, // Showing the results
|
|
||||||
ExaEvt_END, // End: don't show anything
|
|
||||||
} ExaEvt_Showing_t;
|
|
||||||
#define ExaEvt_SHOWING_DEFAULT ExaEvt_START
|
|
||||||
|
|
||||||
struct ExaEvt_Event
|
struct ExaEvt_Event
|
||||||
{
|
{
|
||||||
long EvtCod;
|
long EvtCod;
|
||||||
|
@ -147,21 +136,7 @@ struct ExaEvt_Event
|
||||||
char Title[ExaEvt_MAX_BYTES_TITLE + 1];
|
char Title[ExaEvt_MAX_BYTES_TITLE + 1];
|
||||||
bool Hidden;
|
bool Hidden;
|
||||||
bool Open; // If now is between start and end dates
|
bool Open; // If now is between start and end dates
|
||||||
struct
|
bool ShowUsrResults; // Show exam with results of all questions for the student
|
||||||
{
|
|
||||||
unsigned QstInd; // 0 means that the exam has not started. First question has index 1.
|
|
||||||
long QstCod;
|
|
||||||
time_t QstStartTimeUTC;
|
|
||||||
ExaEvt_Showing_t Showing; // What is shown on teacher's screen
|
|
||||||
long Countdown; // > 0 ==> countdown in progress
|
|
||||||
// = 0 ==> countdown over ==> go to next step
|
|
||||||
// < 0 ==> no countdown at this time
|
|
||||||
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 Happening; // Is being played now?
|
|
||||||
unsigned NumParticipants;
|
|
||||||
} Status; // Status related to event playing
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -282,16 +282,6 @@ void Lay_WriteStartOfPage (void)
|
||||||
HTM_Txt ("<body onload=\"init();\"");
|
HTM_Txt ("<body onload=\"init();\"");
|
||||||
switch (Gbl.Action.Act)
|
switch (Gbl.Action.Act)
|
||||||
{
|
{
|
||||||
case ActNewExaEvt:
|
|
||||||
case ActResExaEvt:
|
|
||||||
case ActBckExaEvt:
|
|
||||||
case ActPlyPauExaEvt:
|
|
||||||
case ActFwdExaEvt:
|
|
||||||
case ActChgNumColExaEvt:
|
|
||||||
case ActChgVisResExaEvtQst:
|
|
||||||
case ActExaEvtCntDwn:
|
|
||||||
HTM_Txt (" class=\"EXA_BG\"");
|
|
||||||
break;
|
|
||||||
case ActNewMch:
|
case ActNewMch:
|
||||||
case ActResMch:
|
case ActResMch:
|
||||||
case ActBckMch:
|
case ActBckMch:
|
||||||
|
@ -764,8 +754,6 @@ static void Lay_WriteScriptInit (void)
|
||||||
bool RefreshConnected;
|
bool RefreshConnected;
|
||||||
bool RefreshLastClicks = false;
|
bool RefreshLastClicks = false;
|
||||||
bool RefreshNewTimeline = false;
|
bool RefreshNewTimeline = false;
|
||||||
bool RefreshExamEventStd = false;
|
|
||||||
bool RefreshExamEventTch = false;
|
|
||||||
bool RefreshMatchStd = false;
|
bool RefreshMatchStd = false;
|
||||||
bool RefreshMatchTch = false;
|
bool RefreshMatchTch = false;
|
||||||
|
|
||||||
|
@ -790,24 +778,6 @@ static void Lay_WriteScriptInit (void)
|
||||||
RefreshNewTimeline = true;
|
RefreshNewTimeline = true;
|
||||||
break;
|
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 */
|
/* Match */
|
||||||
case ActJoiMch:
|
case ActJoiMch:
|
||||||
case ActSeeMchAnsQstStd:
|
case ActSeeMchAnsQstStd:
|
||||||
|
@ -836,10 +806,6 @@ static void Lay_WriteScriptInit (void)
|
||||||
|
|
||||||
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);
|
HTM_TxtF ("\tvar delayNewTL = %lu;\n",Cfg_TIME_TO_REFRESH_TIMELINE);
|
||||||
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
|
else if (RefreshMatchStd) // Refresh match via AJAX
|
||||||
HTM_TxtF ("\tvar delayMatch = %lu;\n",Cfg_TIME_TO_REFRESH_MATCH_STD);
|
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
|
||||||
|
@ -862,10 +828,6 @@ static void Lay_WriteScriptInit (void)
|
||||||
Cfg_TIME_TO_REFRESH_LAST_CLICKS);
|
Cfg_TIME_TO_REFRESH_LAST_CLICKS);
|
||||||
else if (RefreshNewTimeline) // Refresh timeline via AJAX
|
else if (RefreshNewTimeline) // Refresh timeline via AJAX
|
||||||
HTM_Txt ("\tsetTimeout(\"refreshNewTL()\",delayNewTL);\n");
|
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
|
else if (RefreshMatchStd) // Refresh match for a student via AJAX
|
||||||
HTM_Txt ("\tsetTimeout(\"refreshMatchStd()\",delayMatch);\n");
|
HTM_Txt ("\tsetTimeout(\"refreshMatchStd()\",delayMatch);\n");
|
||||||
else if (RefreshMatchTch) // Refresh match for a teacher via AJAX
|
else if (RefreshMatchTch) // Refresh match for a teacher via AJAX
|
||||||
|
@ -947,34 +909,6 @@ static void Lay_WriteScriptParamsAJAX (void)
|
||||||
Act_GetActCod (ActRefOldSocPubUsr),
|
Act_GetActCod (ActRefOldSocPubUsr),
|
||||||
Gbl.Usrs.Other.UsrDat.EncryptedUsrCod);
|
Gbl.Usrs.Other.UsrDat.EncryptedUsrCod);
|
||||||
break;
|
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) */
|
/* Parameters related with match refreshing (for students) */
|
||||||
case ActJoiMch:
|
case ActJoiMch:
|
||||||
case ActSeeMchAnsQstStd:
|
case ActSeeMchAnsQstStd:
|
||||||
|
|
|
@ -10245,279 +10245,6 @@ const char *Txt_Actions[Act_NUM_ACTIONS] =
|
||||||
"" // Potrzebujesz tlumaczenie
|
"" // Potrzebujesz tlumaczenie
|
||||||
#elif L==9 // pt
|
#elif L==9 // pt
|
||||||
"" // Precisa de tradução
|
"" // Precisa de tradução
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[ActResExaEvt] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"" // Necessita traducció
|
|
||||||
#elif L==2 // de
|
|
||||||
"" // Need Übersetzung
|
|
||||||
#elif L==3 // en
|
|
||||||
""
|
|
||||||
#elif L==4 // es
|
|
||||||
""
|
|
||||||
#elif L==5 // fr
|
|
||||||
"" // Besoin de traduction
|
|
||||||
#elif L==6 // gn
|
|
||||||
"" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"" // Bisogno di traduzione
|
|
||||||
#elif L==8 // pl
|
|
||||||
"" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"" // Precisa de tradução
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[ActBckExaEvt] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"" // Necessita traducció
|
|
||||||
#elif L==2 // de
|
|
||||||
"" // Need Übersetzung
|
|
||||||
#elif L==3 // en
|
|
||||||
""
|
|
||||||
#elif L==4 // es
|
|
||||||
""
|
|
||||||
#elif L==5 // fr
|
|
||||||
"" // Besoin de traduction
|
|
||||||
#elif L==6 // gn
|
|
||||||
"" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"" // Bisogno di traduzione
|
|
||||||
#elif L==8 // pl
|
|
||||||
"" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"" // Precisa de tradução
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[ActPlyPauExaEvt] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"" // Necessita traducció
|
|
||||||
#elif L==2 // de
|
|
||||||
"" // Need Übersetzung
|
|
||||||
#elif L==3 // en
|
|
||||||
""
|
|
||||||
#elif L==4 // es
|
|
||||||
""
|
|
||||||
#elif L==5 // fr
|
|
||||||
"" // Besoin de traduction
|
|
||||||
#elif L==6 // gn
|
|
||||||
"" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"" // Bisogno di traduzione
|
|
||||||
#elif L==8 // pl
|
|
||||||
"" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"" // Precisa de tradução
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[ActFwdExaEvt] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"" // Necessita traducció
|
|
||||||
#elif L==2 // de
|
|
||||||
"" // Need Übersetzung
|
|
||||||
#elif L==3 // en
|
|
||||||
""
|
|
||||||
#elif L==4 // es
|
|
||||||
""
|
|
||||||
#elif L==5 // fr
|
|
||||||
"" // Besoin de traduction
|
|
||||||
#elif L==6 // gn
|
|
||||||
"" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"" // Bisogno di traduzione
|
|
||||||
#elif L==8 // pl
|
|
||||||
"" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"" // Precisa de tradução
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[ActChgNumColExaEvt] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"" // Necessita traducció
|
|
||||||
#elif L==2 // de
|
|
||||||
"" // Need Übersetzung
|
|
||||||
#elif L==3 // en
|
|
||||||
""
|
|
||||||
#elif L==4 // es
|
|
||||||
""
|
|
||||||
#elif L==5 // fr
|
|
||||||
"" // Besoin de traduction
|
|
||||||
#elif L==6 // gn
|
|
||||||
"" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"" // Bisogno di traduzione
|
|
||||||
#elif L==8 // pl
|
|
||||||
"" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"" // Precisa de tradução
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[ActChgVisResExaEvtQst] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"" // Necessita traducció
|
|
||||||
#elif L==2 // de
|
|
||||||
"" // Need Übersetzung
|
|
||||||
#elif L==3 // en
|
|
||||||
""
|
|
||||||
#elif L==4 // es
|
|
||||||
""
|
|
||||||
#elif L==5 // fr
|
|
||||||
"" // Besoin de traduction
|
|
||||||
#elif L==6 // gn
|
|
||||||
"" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"" // Bisogno di traduzione
|
|
||||||
#elif L==8 // pl
|
|
||||||
"" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"" // Precisa de tradução
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[ActExaEvtCntDwn] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"" // Necessita traducció
|
|
||||||
#elif L==2 // de
|
|
||||||
"" // Need Übersetzung
|
|
||||||
#elif L==3 // en
|
|
||||||
""
|
|
||||||
#elif L==4 // es
|
|
||||||
""
|
|
||||||
#elif L==5 // fr
|
|
||||||
"" // Besoin de traduction
|
|
||||||
#elif L==6 // gn
|
|
||||||
"" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"" // Bisogno di traduzione
|
|
||||||
#elif L==8 // pl
|
|
||||||
"" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"" // Precisa de tradução
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[ActRefExaEvtTch] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"" // Necessita traducció
|
|
||||||
#elif L==2 // de
|
|
||||||
"" // Need Übersetzung
|
|
||||||
#elif L==3 // en
|
|
||||||
""
|
|
||||||
#elif L==4 // es
|
|
||||||
""
|
|
||||||
#elif L==5 // fr
|
|
||||||
"" // Besoin de traduction
|
|
||||||
#elif L==6 // gn
|
|
||||||
"" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"" // Bisogno di traduzione
|
|
||||||
#elif L==8 // pl
|
|
||||||
"" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"" // Precisa de tradução
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[ActJoiExaEvt] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"" // Necessita traducció
|
|
||||||
#elif L==2 // de
|
|
||||||
"" // Need Übersetzung
|
|
||||||
#elif L==3 // en
|
|
||||||
""
|
|
||||||
#elif L==4 // es
|
|
||||||
""
|
|
||||||
#elif L==5 // fr
|
|
||||||
"" // Besoin de traduction
|
|
||||||
#elif L==6 // gn
|
|
||||||
"" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"" // Bisogno di traduzione
|
|
||||||
#elif L==8 // pl
|
|
||||||
"" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"" // Precisa de tradução
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[ActSeeExaEvtAnsQstStd] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"" // Necessita traducció
|
|
||||||
#elif L==2 // de
|
|
||||||
"" // Need Übersetzung
|
|
||||||
#elif L==3 // en
|
|
||||||
""
|
|
||||||
#elif L==4 // es
|
|
||||||
""
|
|
||||||
#elif L==5 // fr
|
|
||||||
"" // Besoin de traduction
|
|
||||||
#elif L==6 // gn
|
|
||||||
"" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"" // Bisogno di traduzione
|
|
||||||
#elif L==8 // pl
|
|
||||||
"" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"" // Precisa de tradução
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[ActRemExaEvtAnsQstStd] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"" // Necessita traducció
|
|
||||||
#elif L==2 // de
|
|
||||||
"" // Need Übersetzung
|
|
||||||
#elif L==3 // en
|
|
||||||
""
|
|
||||||
#elif L==4 // es
|
|
||||||
""
|
|
||||||
#elif L==5 // fr
|
|
||||||
"" // Besoin de traduction
|
|
||||||
#elif L==6 // gn
|
|
||||||
"" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"" // Bisogno di traduzione
|
|
||||||
#elif L==8 // pl
|
|
||||||
"" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"" // Precisa de tradução
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[ActAnsExaEvtQstStd] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"" // Necessita traducció
|
|
||||||
#elif L==2 // de
|
|
||||||
"" // Need Übersetzung
|
|
||||||
#elif L==3 // en
|
|
||||||
""
|
|
||||||
#elif L==4 // es
|
|
||||||
""
|
|
||||||
#elif L==5 // fr
|
|
||||||
"" // Besoin de traduction
|
|
||||||
#elif L==6 // gn
|
|
||||||
"" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"" // Bisogno di traduzione
|
|
||||||
#elif L==8 // pl
|
|
||||||
"" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"" // Precisa de tradução
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[ActRefExaEvtStd] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"" // Necessita traducció
|
|
||||||
#elif L==2 // de
|
|
||||||
"" // Need Übersetzung
|
|
||||||
#elif L==3 // en
|
|
||||||
""
|
|
||||||
#elif L==4 // es
|
|
||||||
""
|
|
||||||
#elif L==5 // fr
|
|
||||||
"" // Besoin de traduction
|
|
||||||
#elif L==6 // gn
|
|
||||||
"" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"" // Bisogno di traduzione
|
|
||||||
#elif L==8 // pl
|
|
||||||
"" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"" // Precisa de tradução
|
|
||||||
#endif
|
#endif
|
||||||
,
|
,
|
||||||
[ActSeeMyExaEvtResCrs] =
|
[ActSeeMyExaEvtResCrs] =
|
||||||
|
|
Loading…
Reference in New Issue
Block a user