Version19.82

This commit is contained in:
Antonio Cañas Vargas 2019-12-03 02:46:46 +01:00
parent b342f2cafd
commit 27e4653e5a
7 changed files with 277 additions and 109 deletions

View File

@ -1503,7 +1503,7 @@ a:hover /* Default ==> underlined */
{ {
padding:10px 0; padding:10px 0;
background-color:#ddecf1; background-color:#ddecf1;
animation: fadein 2s linear forwards; animation:fadein 2s linear forwards;
} }
@keyframes fadein @keyframes fadein
{ {
@ -1791,7 +1791,7 @@ a:hover /* Default ==> underlined */
text-align:center; text-align:center;
overflow:hidden; overflow:hidden;
background-color:#ddecf1; background-color:#ddecf1;
animation: fadein 2s linear forwards; animation:fadein 2s linear forwards;
} }
@keyframes fadein @keyframes fadein
{ {
@ -2758,7 +2758,7 @@ a:hover img.CENTRE_PHOTO_SHOW
display:table; display:table;
width:100%; width:100%;
height:64px; height:64px;
font-size:32pt; font-size:28pt;
padding:2px; padding:2px;
} }
.MCH_BUTTON_CONTAINER a .MCH_BUTTON_CONTAINER a
@ -2870,8 +2870,7 @@ a:hover img.CENTRE_PHOTO_SHOW
border-radius:4px; border-radius:4px;
border-width:1px; border-width:1px;
border-style:solid; border-style:solid;
box-shadow:0 1px 0 rgba(255,255,255,0.15) inset; color:rgba(255,255,255,0.75);
color:white;
font-size:36pt; font-size:36pt;
font-weight:bold; font-weight:bold;
line-height:normal; line-height:normal;
@ -2882,25 +2881,32 @@ a:hover img.CENTRE_PHOTO_SHOW
text-align:center; text-align:center;
vertical-align:middle; vertical-align:middle;
} }
.MCH_STD_BUTTON .MCH_STD_BUTTON
{ {
box-sizing:border-box; box-sizing:border-box;
width:80%; width:75%;
margin:10px auto; margin:10px auto;
padding:20px; padding:20px;
border-radius:4px; border-radius:4px;
border-width:1px; border-width:1px;
border-style:solid; border-style:solid;
box-shadow:0 1px 0 rgba(255,255,255,0.15) inset; color:rgba(255,255,255,0.75);
color:white;
font-size:44pt; font-size:44pt;
font-weight:bold; font-weight:bold;
line-height:normal; line-height:normal;
white-space:nowrap; white-space:nowrap;
} }
.MCH_STD_ANSWER_SELECTED .MCH_STD_ANSWER_SELECTED
{ {
box-shadow: 0px 0px 18px 12px rgba(0,128,0,1); box-shadow: 0px 0px 18px 12px rgba(0,128,0,1);
animation:fadeinshadow 2s linear forwards;
}
@keyframes fadeinshadow
{
from {box-shadow:0px 0px 18px 12px rgba(0,128,0,1);}
to {box-shadow:none;}
} }
.MCH_RESULT .MCH_RESULT
@ -3298,7 +3304,7 @@ a:hover img.CENTRE_PHOTO_SHOW
.TL_NEW_PUB .TL_NEW_PUB
{ {
background-color:#ddecf1; background-color:#ddecf1;
animation: fadein 2s linear forwards; animation:fadein 2s linear forwards;
} }
@keyframes fadein @keyframes fadein
{ {

View File

@ -626,6 +626,8 @@ Assessment:
476. ActRefMchTch Refresh current question when playing a match (as teacher) 476. ActRefMchTch Refresh current question when playing a match (as teacher)
477. ActJoiMch Show current question when playing a game (as student) 477. ActJoiMch Show current question when playing a game (as student)
NEW. ActSeeMchAnsQstStd View my answer to a match question (as student)
NEW. ActRemMchAnsQstStd Remove my answer to a match question (as student)
478. ActAnsMchQstStd Answer a match question (as student) 478. ActAnsMchQstStd Answer a match question (as student)
479. ActRefMchStd Refresh current question when playing a game (as student) 479. ActRefMchStd Refresh current question when playing a game (as student)
@ -2158,6 +2160,8 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
[ActRefMchTch ] = {1788,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_RFRESH,Mch_GetMatchBeingPlayed ,Mch_RefreshMatchTch ,NULL}, [ActRefMchTch ] = {1788,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_RFRESH,Mch_GetMatchBeingPlayed ,Mch_RefreshMatchTch ,NULL},
[ActJoiMch ] = {1780,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,Mch_GetMatchBeingPlayed ,Mch_JoinMatchAsStd ,NULL}, [ActJoiMch ] = {1780,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,Mch_GetMatchBeingPlayed ,Mch_JoinMatchAsStd ,NULL},
[ActSeeMchAnsQstStd ] = {1808,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,Mch_GetMatchBeingPlayed ,Mch_JoinMatchAsStd ,NULL},
[ActRemMchAnsQstStd ] = {1809,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,Mch_GetMatchBeingPlayed ,Mch_RemoveQuestionAnswer ,NULL},
[ActAnsMchQstStd ] = {1651,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,Mch_GetMatchBeingPlayed ,Mch_ReceiveQuestionAnswer ,NULL}, [ActAnsMchQstStd ] = {1651,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,Mch_GetMatchBeingPlayed ,Mch_ReceiveQuestionAnswer ,NULL},
[ActRefMchStd ] = {1782,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_RFRESH,Mch_GetMatchBeingPlayed ,Mch_RefreshMatchStd ,NULL}, [ActRefMchStd ] = {1782,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_RFRESH,Mch_GetMatchBeingPlayed ,Mch_RefreshMatchStd ,NULL},
@ -5025,6 +5029,8 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActReqUsrPrj, // #1805 ActReqUsrPrj, // #1805
ActShoHidSocComGbl, // #1806 ActShoHidSocComGbl, // #1806
ActShoHidSocComUsr, // #1807 ActShoHidSocComUsr, // #1807
ActSeeMchAnsQstStd, // #1808
ActRemMchAnsQstStd, // #1809
}; };
/*****************************************************************************/ /*****************************************************************************/

View File

@ -64,9 +64,9 @@ typedef enum
typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action
#define Act_NUM_ACTIONS (1 + 4 + 66 + 38 + 12 + 42 + 36 + 19 + 110 + 179 + 437 + 176 + 169 + 16 + 68) #define Act_NUM_ACTIONS (1 + 4 + 66 + 38 + 12 + 42 + 36 + 19 + 110 + 181 + 437 + 176 + 169 + 16 + 68)
#define Act_MAX_ACTION_COD 1807 #define Act_MAX_ACTION_COD 1809
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13
@ -625,59 +625,61 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
#define ActRefMchTch (ActChgCrsTT1stDay + 130) #define ActRefMchTch (ActChgCrsTT1stDay + 130)
#define ActJoiMch (ActChgCrsTT1stDay + 131) #define ActJoiMch (ActChgCrsTT1stDay + 131)
#define ActAnsMchQstStd (ActChgCrsTT1stDay + 132) #define ActSeeMchAnsQstStd (ActChgCrsTT1stDay + 132)
#define ActRefMchStd (ActChgCrsTT1stDay + 133) #define ActRemMchAnsQstStd (ActChgCrsTT1stDay + 133)
#define ActAnsMchQstStd (ActChgCrsTT1stDay + 134)
#define ActRefMchStd (ActChgCrsTT1stDay + 135)
#define ActSeeMyMchRes (ActChgCrsTT1stDay + 134) #define ActSeeMyMchRes (ActChgCrsTT1stDay + 136)
#define ActSeeOneMchResMe (ActChgCrsTT1stDay + 135) #define ActSeeOneMchResMe (ActChgCrsTT1stDay + 137)
#define ActReqSeeUsrMchRes (ActChgCrsTT1stDay + 136) #define ActReqSeeUsrMchRes (ActChgCrsTT1stDay + 138)
#define ActSeeUsrMchRes (ActChgCrsTT1stDay + 137) #define ActSeeUsrMchRes (ActChgCrsTT1stDay + 139)
#define ActSeeOneMchResOth (ActChgCrsTT1stDay + 138) #define ActSeeOneMchResOth (ActChgCrsTT1stDay + 140)
#define ActChgVisResMchUsr (ActChgCrsTT1stDay + 139) #define ActChgVisResMchUsr (ActChgCrsTT1stDay + 141)
#define ActFrmNewGam (ActChgCrsTT1stDay + 140) #define ActFrmNewGam (ActChgCrsTT1stDay + 142)
#define ActEdiOneGam (ActChgCrsTT1stDay + 141) #define ActEdiOneGam (ActChgCrsTT1stDay + 143)
#define ActNewGam (ActChgCrsTT1stDay + 142) #define ActNewGam (ActChgCrsTT1stDay + 144)
#define ActChgGam (ActChgCrsTT1stDay + 143) #define ActChgGam (ActChgCrsTT1stDay + 145)
#define ActReqRemGam (ActChgCrsTT1stDay + 144) #define ActReqRemGam (ActChgCrsTT1stDay + 146)
#define ActRemGam (ActChgCrsTT1stDay + 145) #define ActRemGam (ActChgCrsTT1stDay + 147)
#define ActHidGam (ActChgCrsTT1stDay + 146) #define ActHidGam (ActChgCrsTT1stDay + 148)
#define ActShoGam (ActChgCrsTT1stDay + 147) #define ActShoGam (ActChgCrsTT1stDay + 149)
#define ActAddOneGamQst (ActChgCrsTT1stDay + 148) #define ActAddOneGamQst (ActChgCrsTT1stDay + 150)
#define ActGamLstTstQst (ActChgCrsTT1stDay + 149) #define ActGamLstTstQst (ActChgCrsTT1stDay + 151)
#define ActAddTstQstToGam (ActChgCrsTT1stDay + 150) #define ActAddTstQstToGam (ActChgCrsTT1stDay + 152)
#define ActReqRemGamQst (ActChgCrsTT1stDay + 151) #define ActReqRemGamQst (ActChgCrsTT1stDay + 153)
#define ActRemGamQst (ActChgCrsTT1stDay + 152) #define ActRemGamQst (ActChgCrsTT1stDay + 154)
#define ActUp_GamQst (ActChgCrsTT1stDay + 153) #define ActUp_GamQst (ActChgCrsTT1stDay + 155)
#define ActDwnGamQst (ActChgCrsTT1stDay + 154) #define ActDwnGamQst (ActChgCrsTT1stDay + 156)
#define ActSeeSvy (ActChgCrsTT1stDay + 155) #define ActSeeSvy (ActChgCrsTT1stDay + 157)
#define ActAnsSvy (ActChgCrsTT1stDay + 156) #define ActAnsSvy (ActChgCrsTT1stDay + 158)
#define ActFrmNewSvy (ActChgCrsTT1stDay + 157) #define ActFrmNewSvy (ActChgCrsTT1stDay + 159)
#define ActEdiOneSvy (ActChgCrsTT1stDay + 158) #define ActEdiOneSvy (ActChgCrsTT1stDay + 160)
#define ActNewSvy (ActChgCrsTT1stDay + 159) #define ActNewSvy (ActChgCrsTT1stDay + 161)
#define ActChgSvy (ActChgCrsTT1stDay + 160) #define ActChgSvy (ActChgCrsTT1stDay + 162)
#define ActReqRemSvy (ActChgCrsTT1stDay + 161) #define ActReqRemSvy (ActChgCrsTT1stDay + 163)
#define ActRemSvy (ActChgCrsTT1stDay + 162) #define ActRemSvy (ActChgCrsTT1stDay + 164)
#define ActReqRstSvy (ActChgCrsTT1stDay + 163) #define ActReqRstSvy (ActChgCrsTT1stDay + 165)
#define ActRstSvy (ActChgCrsTT1stDay + 164) #define ActRstSvy (ActChgCrsTT1stDay + 166)
#define ActHidSvy (ActChgCrsTT1stDay + 165) #define ActHidSvy (ActChgCrsTT1stDay + 167)
#define ActShoSvy (ActChgCrsTT1stDay + 166) #define ActShoSvy (ActChgCrsTT1stDay + 168)
#define ActEdiOneSvyQst (ActChgCrsTT1stDay + 167) #define ActEdiOneSvyQst (ActChgCrsTT1stDay + 169)
#define ActRcvSvyQst (ActChgCrsTT1stDay + 168) #define ActRcvSvyQst (ActChgCrsTT1stDay + 170)
#define ActReqRemSvyQst (ActChgCrsTT1stDay + 169) #define ActReqRemSvyQst (ActChgCrsTT1stDay + 171)
#define ActRemSvyQst (ActChgCrsTT1stDay + 170) #define ActRemSvyQst (ActChgCrsTT1stDay + 172)
#define ActSeeOneExaAnn (ActChgCrsTT1stDay + 171) #define ActSeeOneExaAnn (ActChgCrsTT1stDay + 173)
#define ActSeeDatExaAnn (ActChgCrsTT1stDay + 172) #define ActSeeDatExaAnn (ActChgCrsTT1stDay + 174)
#define ActEdiExaAnn (ActChgCrsTT1stDay + 173) #define ActEdiExaAnn (ActChgCrsTT1stDay + 175)
#define ActRcvExaAnn (ActChgCrsTT1stDay + 174) #define ActRcvExaAnn (ActChgCrsTT1stDay + 176)
#define ActPrnExaAnn (ActChgCrsTT1stDay + 175) #define ActPrnExaAnn (ActChgCrsTT1stDay + 177)
#define ActReqRemExaAnn (ActChgCrsTT1stDay + 176) #define ActReqRemExaAnn (ActChgCrsTT1stDay + 178)
#define ActRemExaAnn (ActChgCrsTT1stDay + 177) #define ActRemExaAnn (ActChgCrsTT1stDay + 179)
#define ActHidExaAnn (ActChgCrsTT1stDay + 178) #define ActHidExaAnn (ActChgCrsTT1stDay + 180)
#define ActShoExaAnn (ActChgCrsTT1stDay + 179) #define ActShoExaAnn (ActChgCrsTT1stDay + 181)
/*****************************************************************************/ /*****************************************************************************/
/******************************** Files tab **********************************/ /******************************** Files tab **********************************/

View File

@ -490,15 +490,20 @@ 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.81.1 (2019-12-01)" #define Log_PLATFORM_VERSION "SWAD 19.82 (2019-12-03)"
#define CSS_FILE "swad19.78.1.css" #define CSS_FILE "swad19.82.css"
#define JS_FILE "swad19.70.js" #define JS_FILE "swad19.70.js"
/* /*
// TODO: Hacer un nuevo rol en los TFG: tutor externo (profesor de áreas no vinculadas con el centro, profesionales de empresas, etc.) // TODO: Hacer un nuevo rol en los TFG: tutor externo (profesor de áreas no vinculadas con el centro, profesionales de empresas, etc.)
// TODO: Impedir la creación y edición de proyectos si no son editables. // TODO: Impedir la creación y edición de proyectos si no son editables.
// TODO: En cada juego, poder listar los resultados en una tabla como la de resultados globales // TODO: En cada juego, poder listar los resultados en una tabla como la de resultados globales
Version 19.81.1: Dec 01, 2019 API function playMatch finished. (247620 lines) Version 19.82: Dec 03, 2019 Changes in feedback in matches. (247758 lines)
2 changes necessary in database:
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1808','es','N','Ver mi respuesta a pregunta en partida');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1809','es','N','Eliminar mi respuesta a pregunta en partida');
Version 19.81.1: Dec 02, 2019 API function playMatch finished. (247620 lines)
Version 19.81: Dec 01, 2019 New (some unfinished) API functions related to games and matches. (247540 lines) Version 19.81: Dec 01, 2019 New (some unfinished) API functions related to games and matches. (247540 lines)
Version 19.80.7: Nov 29, 2019 Changes in match results. (247242 lines) Version 19.80.7: Nov 29, 2019 Changes in match results. (247242 lines)
Version 19.80.6: Nov 28, 2019 Changes in match results and test results. (247245 lines) Version 19.80.6: Nov 28, 2019 Changes in match results and test results. (247245 lines)

View File

@ -678,6 +678,8 @@ static void Lay_WriteScriptInit (void)
RefreshNewTimeline = true; RefreshNewTimeline = true;
break; break;
case ActJoiMch: case ActJoiMch:
case ActSeeMchAnsQstStd:
case ActRemMchAnsQstStd:
case ActAnsMchQstStd: case ActAnsMchQstStd:
RefreshMatchStd = true; RefreshMatchStd = true;
break; break;
@ -811,6 +813,8 @@ static void Lay_WriteScriptParamsAJAX (void)
break; break;
/* Parameters related with match refreshing (for students) */ /* Parameters related with match refreshing (for students) */
case ActJoiMch: case ActJoiMch:
case ActSeeMchAnsQstStd:
case ActRemMchAnsQstStd:
case ActAnsMchQstStd: case ActAnsMchQstStd:
// Refresh parameters // Refresh parameters
HTM_TxtF ("var RefreshParamNxtActMch = \"act=%ld\";\n" HTM_TxtF ("var RefreshParamNxtActMch = \"act=%ld\";\n"

View File

@ -65,6 +65,12 @@ extern struct Globals Gbl;
/******************************* Private types *******************************/ /******************************* Private types *******************************/
/*****************************************************************************/ /*****************************************************************************/
typedef enum
{
Mch_CHANGE_STATUS_BY_STUDENT,
Mch_REFRESH_STATUS_BY_SERVER,
} Mch_Update_t;
/*****************************************************************************/ /*****************************************************************************/
/***************************** Private constants *****************************/ /***************************** Private constants *****************************/
/*****************************************************************************/ /*****************************************************************************/
@ -149,13 +155,16 @@ static void Mch_SetMatchStatusToNextQst (struct Match *Match);
static void Mch_SetMatchStatusToEnd (struct Match *Match); static void Mch_SetMatchStatusToEnd (struct Match *Match);
static void Mch_ShowMatchStatusForTch (struct Match *Match); static void Mch_ShowMatchStatusForTch (struct Match *Match);
static void Mch_ShowMatchStatusForStd (struct Match *Match); static void Mch_ShowMatchStatusForStd (struct Match *Match,Mch_Update_t Update);
static void Mch_ShowLeftColumnTch (struct Match *Match); static void Mch_ShowLeftColumnTch (struct Match *Match);
static void Mch_ShowRefreshablePartTch (struct Match *Match); static void Mch_ShowRefreshablePartTch (struct Match *Match);
static void Mch_ShowRightColumnTch (struct Match *Match); static void Mch_ShowRightColumnTch (struct Match *Match);
static void Mch_ShowLeftColumnStd (struct Match *Match); static void Mch_ShowLeftColumnStd (struct Match *Match,
static void Mch_ShowRightColumnStd (struct Match *Match); const struct Mch_UsrAnswer *UsrAnswer);
static void Mch_ShowRightColumnStd (struct Match *Match,
const struct Mch_UsrAnswer *UsrAnswer,
Mch_Update_t Update);
static void Mch_ShowNumQstInMatch (struct Match *Match); static void Mch_ShowNumQstInMatch (struct Match *Match);
static void Mch_PutMatchControlButtons (struct Match *Match); static void Mch_PutMatchControlButtons (struct Match *Match);
@ -164,10 +173,14 @@ static void Mch_PutParamNumCols (unsigned NumCols);
static void Mch_ShowMatchTitle (struct Match *Match); static void Mch_ShowMatchTitle (struct Match *Match);
static void Mch_PutCheckboxResult (struct Match *Match); static void Mch_PutCheckboxResult (struct Match *Match);
static void Mch_PutIfAnswered (const struct Match *Match,bool Answered);
static void Mch_PutIconToRemoveMyAnswer (struct Match *Match);
static void Mch_ShowQuestionAndAnswersTch (struct Match *Match); static void Mch_ShowQuestionAndAnswersTch (struct Match *Match);
static void Mch_WriteAnswersMatchResult (struct Match *Match, static void Mch_WriteAnswersMatchResult (struct Match *Match,
const char *Class,bool ShowResult); const char *Class,bool ShowResult);
static void Mch_ShowQuestionAndAnswersStd (struct Match *Match); static void Mch_ShowQuestionAndAnswersStd (struct Match *Match,
const struct Mch_UsrAnswer *UsrAnswer,
Mch_Update_t Update);
static void Mch_ShowMatchScore (struct Match *Match); static void Mch_ShowMatchScore (struct Match *Match);
static void Mch_DrawEmptyRowScore (unsigned NumRow,double MinScore,double MaxScore); static void Mch_DrawEmptyRowScore (unsigned NumRow,double MinScore,double MaxScore);
@ -191,6 +204,8 @@ static void Mch_SetMatchAsNotBeingPlayed (long MchCod);
static bool Mch_GetIfMatchIsBeingPlayed (long MchCod); static bool Mch_GetIfMatchIsBeingPlayed (long MchCod);
static void Mch_GetNumPlayers (struct Match *Match); static void Mch_GetNumPlayers (struct Match *Match);
static void Mch_RemoveAnswerToMatchQuestion (const struct Match *Match);
static double Mch_ComputeScore (unsigned NumQsts); static double Mch_ComputeScore (unsigned NumQsts);
static unsigned Mch_GetNumUsrsWhoHaveChosenAns (long MchCod,unsigned QstInd,unsigned AnsInd); static unsigned Mch_GetNumUsrsWhoHaveChosenAns (long MchCod,unsigned QstInd,unsigned AnsInd);
@ -2029,20 +2044,28 @@ static void Mch_ShowMatchStatusForTch (struct Match *Match)
/************ Show current question being played for a student ***************/ /************ Show current question being played for a student ***************/
/*****************************************************************************/ /*****************************************************************************/
static void Mch_ShowMatchStatusForStd (struct Match *Match) static void Mch_ShowMatchStatusForStd (struct Match *Match,Mch_Update_t Update)
{ {
bool ICanPlayThisMatchBasedOnGrps; bool ICanPlayThisMatchBasedOnGrps;
struct Mch_UsrAnswer UsrAnswer;
/***** Can I play this match? *****/ /***** Can I play this match? *****/
ICanPlayThisMatchBasedOnGrps = Mch_CheckIfICanPlayThisMatchBasedOnGrps (Match->MchCod); ICanPlayThisMatchBasedOnGrps = Mch_CheckIfICanPlayThisMatchBasedOnGrps (Match->MchCod);
if (!ICanPlayThisMatchBasedOnGrps) if (!ICanPlayThisMatchBasedOnGrps)
Lay_NoPermissionExit (); Lay_NoPermissionExit ();
/***** Get student's answer to this question
(<0 ==> no answer) *****/
Mch_GetQstAnsFromDB (Match->MchCod,
Gbl.Usrs.Me.UsrDat.UsrCod,
Match->Status.QstInd,
&UsrAnswer);
/***** Left column *****/ /***** Left column *****/
Mch_ShowLeftColumnStd (Match); Mch_ShowLeftColumnStd (Match,&UsrAnswer);
/***** Right column *****/ /***** Right column *****/
Mch_ShowRightColumnStd (Match); Mch_ShowRightColumnStd (Match,&UsrAnswer,Update);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -2204,8 +2227,11 @@ static void Mch_ShowRightColumnTch (struct Match *Match)
/*********** Show left column when playing a match (as a student) ************/ /*********** Show left column when playing a match (as a student) ************/
/*****************************************************************************/ /*****************************************************************************/
static void Mch_ShowLeftColumnStd (struct Match *Match) static void Mch_ShowLeftColumnStd (struct Match *Match,
const struct Mch_UsrAnswer *UsrAnswer)
{ {
bool Answered = UsrAnswer->NumOpt >= 0;
/***** Start left container *****/ /***** Start left container *****/
HTM_DIV_Begin ("class=\"MCH_LEFT\""); HTM_DIV_Begin ("class=\"MCH_LEFT\"");
@ -2216,6 +2242,14 @@ static void Mch_ShowLeftColumnStd (struct Match *Match)
/***** Write number of question *****/ /***** Write number of question *****/
Mch_ShowNumQstInMatch (Match); Mch_ShowNumQstInMatch (Match);
/***** Write if question is answered *****/
Mch_PutIfAnswered (Match,Answered);
if (Match->Status.Showing == Mch_ANSWERS &&
Answered)
/***** Put icon to view *****/
Mch_PutIconToRemoveMyAnswer (Match);
/***** End left container *****/ /***** End left container *****/
HTM_DIV_End (); HTM_DIV_End ();
} }
@ -2224,7 +2258,9 @@ static void Mch_ShowLeftColumnStd (struct Match *Match)
/********** Show right column when playing a match (as a student) ************/ /********** Show right column when playing a match (as a student) ************/
/*****************************************************************************/ /*****************************************************************************/
static void Mch_ShowRightColumnStd (struct Match *Match) static void Mch_ShowRightColumnStd (struct Match *Match,
const struct Mch_UsrAnswer *UsrAnswer,
Mch_Update_t Update)
{ {
extern const char *Txt_Please_wait_; extern const char *Txt_Please_wait_;
@ -2244,7 +2280,7 @@ static void Mch_ShowRightColumnStd (struct Match *Match)
/***** Update players ******/ /***** Update players ******/
if (Mch_RegisterMeAsPlayerInMatch (Match)) if (Mch_RegisterMeAsPlayerInMatch (Match))
/* Show current question and possible answers */ /* Show current question and possible answers */
Mch_ShowQuestionAndAnswersStd (Match); Mch_ShowQuestionAndAnswersStd (Match,UsrAnswer,Update);
else else
Ale_ShowAlert (Ale_ERROR,"You can not join this match."); Ale_ShowAlert (Ale_ERROR,"You can not join this match.");
@ -2434,6 +2470,88 @@ static void Mch_PutCheckboxResult (struct Match *Match)
HTM_DIV_End (); HTM_DIV_End ();
} }
/*****************************************************************************/
/***************** Put checkbox to select if show results ********************/
/*****************************************************************************/
static void Mch_PutIfAnswered (const struct Match *Match,bool Answered)
{
extern const char *Txt_View_results;
/***** Start container *****/
HTM_DIV_Begin ("class=\"MCH_SHOW_RESULTS\"");
/***** Put icon with link *****/
if (Match->Status.Showing == Mch_ANSWERS &&
Answered)
{
/* Start form */
Frm_StartForm (ActSeeMchAnsQstStd);
Mch_PutParamMchCod (Match->MchCod); // Current match being played
HTM_A_Begin ("href=\"\" class=\"DAT_SMALL\" title=\"%s\" "
" onclick=\"document.getElementById('%s').submit();return false;\"",
"Ver mi respuesta", // TODO: Need translation!!!!
Gbl.Form.Id);
HTM_TxtF ("<i class=\"%s\" title=\"%s\"></i>",
"fas fa-check-circle",
"Respondida"); // TODO: Need translation!!!!
HTM_TxtF ("&nbsp;%s","Respondida"); // TODO: Need translation!!!!
HTM_A_End ();
/* End form */
Frm_EndForm ();
}
else
{
HTM_DIV_Begin ("class=\"DAT_SMALL\"");
HTM_TxtF ("<i class=\"%s\" title=\"%s\"></i>",
Answered ? "fas fa-check-circle" :
"fas fa-exclamation-circle",
Answered ? "Respondida" :
"No respondida"); // TODO: Need translation!!!!
HTM_TxtF ("&nbsp;%s",Answered ? "Respondida" :
"No respondida"); // TODO: Need translation!!!!
HTM_DIV_End ();
}
/***** End container *****/
HTM_DIV_End ();
}
/*****************************************************************************/
/***************** Put checkbox to select if show results ********************/
/*****************************************************************************/
static void Mch_PutIconToRemoveMyAnswer (struct Match *Match)
{
extern const char *Txt_View_results;
/***** Start container *****/
HTM_DIV_Begin ("class=\"MCH_SHOW_RESULTS\"");
/***** Start form *****/
Frm_StartForm (ActRemMchAnsQstStd);
Mch_PutParamMchCod (Match->MchCod); // Current match being played
Gam_PutParamQstInd (Match->Status.QstInd); // Current question index shown
/***** Put icon with link *****/
HTM_DIV_Begin ("class=\"MCH_BUTTON_CONTAINER\"");
HTM_A_Begin ("href=\"\" class=\"MCH_BUTTON_ON\" title=\"%s\" "
" onclick=\"document.getElementById('%s').submit();return false;\"",
"Eliminar mi respuesta", // TODO: Need translation!!!!
Gbl.Form.Id);
HTM_Txt ("<i class=\"fas fa-trash\" style=\"color:#660000;\"></i>");
HTM_A_End ();
HTM_DIV_End ();
/***** End form *****/
Frm_EndForm ();
/***** End container *****/
HTM_DIV_End ();
}
/*****************************************************************************/ /*****************************************************************************/
/***************************** Show match title ******************************/ /***************************** Show match title ******************************/
/*****************************************************************************/ /*****************************************************************************/
@ -2541,9 +2659,10 @@ static void Mch_WriteAnswersMatchResult (struct Match *Match,
/***** Show question and its answers when playing a match (as a student) *****/ /***** Show question and its answers when playing a match (as a student) *****/
/*****************************************************************************/ /*****************************************************************************/
static void Mch_ShowQuestionAndAnswersStd (struct Match *Match) static void Mch_ShowQuestionAndAnswersStd (struct Match *Match,
const struct Mch_UsrAnswer *UsrAnswer,
Mch_Update_t Update)
{ {
struct Mch_UsrAnswer UsrAnswer;
unsigned NumOptions; unsigned NumOptions;
unsigned NumOpt; unsigned NumOpt;
char *Class; char *Class;
@ -2554,13 +2673,6 @@ static void Mch_ShowQuestionAndAnswersStd (struct Match *Match)
{ {
if (Tst_CheckIfQuestionIsValidForGame (Match->Status.QstCod)) if (Tst_CheckIfQuestionIsValidForGame (Match->Status.QstCod))
{ {
/***** Get student's answer to this question
(<0 ==> no answer) *****/
Mch_GetQstAnsFromDB (Match->MchCod,
Gbl.Usrs.Me.UsrDat.UsrCod,
Match->Status.QstInd,
&UsrAnswer);
/***** Get number of options in this question *****/ /***** Get number of options in this question *****/
NumOptions = Tst_GetNumAnswersQst (Match->Status.QstCod); NumOptions = Tst_GetNumAnswersQst (Match->Status.QstCod);
@ -2587,17 +2699,12 @@ static void Mch_ShowQuestionAndAnswersStd (struct Match *Match)
Gam_PutParamQstInd (Match->Status.QstInd); // Current question index shown Gam_PutParamQstInd (Match->Status.QstInd); // Current question index shown
Mch_PutParamNumOpt (NumOpt); // Number of button Mch_PutParamNumOpt (NumOpt); // Number of button
if (UsrAnswer.NumOpt == (int) NumOpt) // Student's answer if (asprintf (&Class,"MCH_STD_BUTTON%s BT_%c",
{ UsrAnswer->NumOpt == (int) NumOpt && // Student's answer
if (asprintf (&Class,"MCH_STD_ANSWER_SELECTED " Update == Mch_CHANGE_STATUS_BY_STUDENT ? " MCH_STD_ANSWER_SELECTED" :
"MCH_STD_BUTTON BT_%c",'A' + (char) NumOpt) < 0) "",
'A' + (char) NumOpt) < 0)
Lay_NotEnoughMemoryExit (); Lay_NotEnoughMemoryExit ();
}
else
{
if (asprintf (&Class,"MCH_STD_BUTTON BT_%c",'A' + (char) NumOpt) < 0)
Lay_NotEnoughMemoryExit ();
}
HTM_BUTTON_OnMouseDown_Begin (Class); HTM_BUTTON_OnMouseDown_Begin (Class);
HTM_TxtF ("%c",'a' + (char) NumOpt); HTM_TxtF ("%c",'a' + (char) NumOpt);
HTM_BUTTON_End (); HTM_BUTTON_End ();
@ -3030,7 +3137,7 @@ void Mch_GetMatchBeingPlayed (void)
} }
/*****************************************************************************/ /*****************************************************************************/
/********* Show game being played to me as student in a new window ***********/ /********************* Show match being played as student ********************/
/*****************************************************************************/ /*****************************************************************************/
void Mch_JoinMatchAsStd (void) void Mch_JoinMatchAsStd (void)
@ -3043,7 +3150,36 @@ void Mch_JoinMatchAsStd (void)
/***** Show current match status *****/ /***** Show current match status *****/
HTM_DIV_Begin ("id=\"match\" class=\"MCH_CONT\""); HTM_DIV_Begin ("id=\"match\" class=\"MCH_CONT\"");
Mch_ShowMatchStatusForStd (&Match); Mch_ShowMatchStatusForStd (&Match,Mch_CHANGE_STATUS_BY_STUDENT);
HTM_DIV_End ();
}
/*****************************************************************************/
/****** Remove student's answer to a question and show match as student ******/
/*****************************************************************************/
void Mch_RemoveQuestionAnswer (void)
{
struct Match Match;
unsigned QstInd;
/***** Get data of the match from database *****/
Match.MchCod = Gbl.Games.MchCodBeingPlayed;
Mch_GetDataOfMatchByCod (&Match);
/***** Get question index from form *****/
QstInd = Gam_GetParamQstInd ();
/***** Check that teacher's screen is showing answers
and question index is the current one being played *****/
if (Match.Status.Showing == Mch_ANSWERS && // Teacher's screen is showing answers
QstInd == Match.Status.QstInd) // Removing answer to the current question being played
/***** Remove answer to this question *****/
Mch_RemoveAnswerToMatchQuestion (&Match);
/***** Show current match status *****/
HTM_DIV_Begin ("id=\"match\" class=\"MCH_CONT\"");
Mch_ShowMatchStatusForStd (&Match,Mch_CHANGE_STATUS_BY_STUDENT);
HTM_DIV_End (); HTM_DIV_End ();
} }
@ -3093,7 +3229,7 @@ void Mch_RefreshMatchStd (void)
Mch_GetDataOfMatchByCod (&Match); Mch_GetDataOfMatchByCod (&Match);
/***** Show current match status *****/ /***** Show current match status *****/
Mch_ShowMatchStatusForStd (&Match); Mch_ShowMatchStatusForStd (&Match,Mch_REFRESH_STATUS_BY_SERVER);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -3159,14 +3295,14 @@ void Mch_ReceiveQuestionAnswer (void)
/***** Get question index from form *****/ /***** Get question index from form *****/
QstInd = Gam_GetParamQstInd (); QstInd = Gam_GetParamQstInd ();
/***** Get indexes for this question from database *****/
Mch_GetIndexes (Match.MchCod,QstInd,Indexes);
/***** Check that teacher's screen is showing answers /***** Check that teacher's screen is showing answers
and question index is the current one being played *****/ and question index is the current one being played *****/
if (Match.Status.Showing == Mch_ANSWERS && // Teacher's screen is showing answers if (Match.Status.Showing == Mch_ANSWERS && // Teacher's screen is showing answers
QstInd == Match.Status.QstInd) // Receiving an answer to the current question being played QstInd == Match.Status.QstInd) // Receiving an answer to the current question being played
{ {
/***** Get indexes for this question from database *****/
Mch_GetIndexes (Match.MchCod,Match.Status.QstInd,Indexes);
/***** Get answer index *****/ /***** Get answer index *****/
/* /*
Indexes[4] = {0,3,1,2} Indexes[4] = {0,3,1,2}
@ -3188,23 +3324,19 @@ void Mch_ReceiveQuestionAnswer (void)
/***** Get previous student's answer to this question /***** Get previous student's answer to this question
(<0 ==> no answer) *****/ (<0 ==> no answer) *****/
Mch_GetQstAnsFromDB (Match.MchCod,Gbl.Usrs.Me.UsrDat.UsrCod,QstInd, Mch_GetQstAnsFromDB (Match.MchCod,Gbl.Usrs.Me.UsrDat.UsrCod,Match.Status.QstInd,
&PreviousUsrAnswer); &PreviousUsrAnswer);
/***** Store student's answer *****/ /***** Store student's answer *****/
if (PreviousUsrAnswer.AnsInd == UsrAnswer.AnsInd) if (UsrAnswer.NumOpt >= 0 &&
DB_QueryDELETE ("can not remove your answer to the match question", UsrAnswer.AnsInd >= 0 &&
"DELETE FROM mch_answers" UsrAnswer.AnsInd != PreviousUsrAnswer.AnsInd)
" WHERE MchCod=%ld AND UsrCod=%ld AND QstInd=%u",
Match.MchCod,Gbl.Usrs.Me.UsrDat.UsrCod,QstInd);
else if (UsrAnswer.NumOpt >= 0 &&
UsrAnswer.AnsInd >= 0)
DB_QueryREPLACE ("can not register your answer to the match question", DB_QueryREPLACE ("can not register your answer to the match question",
"REPLACE mch_answers" "REPLACE mch_answers"
" (MchCod,UsrCod,QstInd,NumOpt,AnsInd)" " (MchCod,UsrCod,QstInd,NumOpt,AnsInd)"
" VALUES" " VALUES"
" (%ld,%ld,%u,%d,%d)", " (%ld,%ld,%u,%d,%d)",
Match.MchCod,Gbl.Usrs.Me.UsrDat.UsrCod,QstInd, Match.MchCod,Gbl.Usrs.Me.UsrDat.UsrCod,Match.Status.QstInd,
UsrAnswer.NumOpt, UsrAnswer.NumOpt,
UsrAnswer.AnsInd); UsrAnswer.AnsInd);
@ -3248,10 +3380,22 @@ void Mch_ReceiveQuestionAnswer (void)
/***** Show current match status *****/ /***** Show current match status *****/
HTM_DIV_Begin ("id=\"match\" class=\"MCH_CONT\""); HTM_DIV_Begin ("id=\"match\" class=\"MCH_CONT\"");
Mch_ShowMatchStatusForStd (&Match); Mch_ShowMatchStatusForStd (&Match,Mch_CHANGE_STATUS_BY_STUDENT);
HTM_DIV_End (); HTM_DIV_End ();
} }
/*****************************************************************************/
/********************* Remove answer to match question ***********************/
/*****************************************************************************/
static void Mch_RemoveAnswerToMatchQuestion (const struct Match *Match)
{
DB_QueryDELETE ("can not remove your answer to the match question",
"DELETE FROM mch_answers"
" WHERE MchCod=%ld AND UsrCod=%ld AND QstInd=%u",
Match->MchCod,Gbl.Usrs.Me.UsrDat.UsrCod,Match->Status.QstInd);
}
/*****************************************************************************/ /*****************************************************************************/
/******************** Compute match score for a student **********************/ /******************** Compute match score for a student **********************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -115,6 +115,7 @@ bool Mch_RegisterMeAsPlayerInMatch (struct Match *Match);
void Mch_GetMatchBeingPlayed (void); void Mch_GetMatchBeingPlayed (void);
void Mch_JoinMatchAsStd (void); void Mch_JoinMatchAsStd (void);
void Mch_RemoveQuestionAnswer (void);
void Mch_RefreshMatchTch (void); void Mch_RefreshMatchTch (void);
void Mch_RefreshMatchStd (void); void Mch_RefreshMatchStd (void);