Version18.136.2

This commit is contained in:
Antonio Cañas Vargas 2019-07-18 22:48:27 +02:00
parent cfe0560b60
commit c9f3337c67
6 changed files with 248 additions and 198 deletions

View File

@ -2568,41 +2568,41 @@ a:hover img.CENTRE_PHOTO_SHOW
{
box-sizing:border-box;
display:table;
margin:5%;
width:90%;
margin:4%;
width:92%;
}
.MATCH_TOP
{
box-sizing:border-box;
display:table;
width:100%;
padding-bottom:12pt;
font-size:18pt;
border:1px solid pink;
padding-bottom:18pt;
/* border:1px solid pink; */
}
.MATCH_TOP_LEFT
{
box-sizing:border-box;
float:left;
width:80%;
width:60%;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
border:1px solid red;
/* border:1px solid red; */
}
.MATCH_TOP_RIGHT
{
box-sizing:border-box;
float:left;
width:20%;
width:40%;
text-align:right;
border:1px solid blue;
/* border:1px solid blue; */
}
.MATCH_BOTTOM
{
box-sizing:border-box;
width:100%;
border:1px solid pink;
/* border:1px solid pink; */
}
.MATCH_BOTTOM_LEFT
{
@ -2612,14 +2612,14 @@ a:hover img.CENTRE_PHOTO_SHOW
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
border:1px solid red;
/* border:1px solid red; */
}
.MATCH_BOTTOM_RIGHT
{
box-sizing:border-box;
float:left;
width:80%;
border:1px solid blue;
/* border:1px solid blue; */
}
.MATCH_TCH_NUM_QST
@ -2627,7 +2627,7 @@ a:hover img.CENTRE_PHOTO_SHOW
text-align:center;
padding-bottom:24pt;
color:#808080;
font-size:48pt;
font-size:36pt;
font-weight:bold;
}
.MATCH_TCH_NXT_CONTAINER
@ -2670,7 +2670,7 @@ a:hover img.CENTRE_PHOTO_SHOW
float:left;
padding-bottom:24pt;
color:#808080;
font-size:48pt;
font-size:36pt;
font-weight:bold;
}
.MATCH_STD_QST_CONTAINER

View File

@ -149,7 +149,7 @@ void Btn_PutRemoveButtonInline (const char *TxtButton)
"</button>",
TxtButton);
}
/*
void Btn_PutCloseTabButton (const char *TxtButton)
{
fprintf (Gbl.F.Out,"<div class=\"CENTER_MIDDLE\">"
@ -160,3 +160,4 @@ void Btn_PutCloseTabButton (const char *TxtButton)
"</div>",
TxtButton);
}
*/

View File

@ -55,6 +55,6 @@ void Btn_PutConfirmButton (const char *TxtButton);
void Btn_PutConfirmButtonInline (const char *TxtButton);
void Btn_PutRemoveButton (const char *TxtButton);
void Btn_PutRemoveButtonInline (const char *TxtButton);
void Btn_PutCloseTabButton (const char *TxtButton);
// void Btn_PutCloseTabButton (const char *TxtButton);
#endif

View File

@ -458,10 +458,11 @@ En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 18.136.1 (2019-07-18)"
#define Log_PLATFORM_VERSION "SWAD 18.136.2 (2019-07-18)"
#define CSS_FILE "swad18.136.css"
#define JS_FILE "swad18.130.2.js"
/*
Version 18.136.2: Jul 18, 2019 Changes in layout of match. (243895 lines)
Version 18.136.1: Jul 18, 2019 Changes in layout of match. (243853 lines)
Version 18.136: Jul 18, 2019 Changes in layout of match. (243767 lines)
Version 18.135.7: Jul 17, 2019 CSS refactoring and translation in match playing. (243699 lines)

View File

@ -187,9 +187,12 @@ static void Gam_UpdateMatchStatusInDB (struct Match *Match);
static void Gam_SetMatchStatusToNextQuestion (struct Match *Match);
static void Gam_ShowMatchStatusForTch (struct Match *Match);
static void Gam_ShowAlertFinishedMatch (void);
static void Gam_ShowMatchStatusForStd (struct Match *Match);
static void Gam_ShowBottonLeftColumnTch (struct Match *Match);
static void Gam_ShowBottonLeftColumnStd (struct Match *Match);
static void Gam_ShowQuestionAndAnswersTch (struct Match *Match);
static void Gam_ShowQuestionAndAnswersStd (struct Match *Match);
static void Gam_PutBigButton (Act_Action_t NextAction,long MchCod,
const char *Icon,const char *Txt);
static void Gam_PutBigButtonClose (void);
@ -2781,7 +2784,7 @@ static void Gam_ListOneOrMoreMatches (struct Game *Game,
extern const char *Txt_Match;
extern const char *Txt_Status;
extern const char *Txt_Play;
extern const char *Txt_Resume_match;
extern const char *Txt_Resume;
extern const char *Txt_Today;
extern const char *Txt_View_game_results;
unsigned NumMatch;
@ -2929,7 +2932,7 @@ static void Gam_ListOneOrMoreMatches (struct Game *Game,
Lay_PutContextualLinkOnlyIcon (ActResMchTch,NULL,
Gam_PutParamCurrentMchCod,
"play.svg",
Txt_Resume_match);
Txt_Resume);
break;
default:
break;
@ -3496,19 +3499,51 @@ static void Gam_ShowMatchStatusForTch (struct Match *Match)
}
/*****************************************************************************/
/********************* Show alert about finished match ***********************/
/************ Show current question being played for a student ***************/
/*****************************************************************************/
static void Gam_ShowAlertFinishedMatch (void)
static void Gam_ShowMatchStatusForStd (struct Match *Match)
{
extern const char *Txt_Finished_match;
extern const char *Txt_Close;
extern const char *Txt_Please_wait_;
bool IBelongToGroups;
/***** Show alert *****/
Ale_ShowAlert (Ale_INFO,Txt_Finished_match);
/***** Do I belong to valid groups to play this match? *****/
IBelongToGroups = Gbl.Usrs.Me.IBelongToCurrentCrs &&
Gam_CheckIfIPlayThisMatchBasedOnGrps (Match->MchCod);
if (!IBelongToGroups)
Lay_ShowErrorAndExit ("You can not play this match!");
/***** Button to close browser tab *****/
Btn_PutCloseTabButton (Txt_Close);
/***** Bottom row *****/
/* Start bottom container */
fprintf (Gbl.F.Out,"<div class=\"MATCH_BOTTOM\">");
/* Show left column */
Gam_ShowBottonLeftColumnStd (Match);
/* Show right column */
fprintf (Gbl.F.Out,"<div class=\"MATCH_BOTTOM_RIGHT\">");
if (!Match->Status.Finished)
{
/***** Update players ******/
Gam_RegisterMeAsPlayerInMatch (Match->MchCod);
if (Match->Status.BeingPlayed)
/* Show current question and possible answers */
Gam_ShowQuestionAndAnswersStd (Match);
else // Not being played
fprintf (Gbl.F.Out,"<div class=\"MATCH_STD_WAIT_CONTAINER\">"
"<img src=\"%s/wait.gif\""
" alt=\"%s\" title=\"%s\""
" class=\"MATCH_STD_WAIT_IMAGE\" />"
"</div>",
Cfg_URL_ICON_PUBLIC,
Txt_Please_wait_,
Txt_Please_wait_);
}
fprintf (Gbl.F.Out,"</div>");
/* End bottom container */
fprintf (Gbl.F.Out,"</div>");
}
/*****************************************************************************/
@ -3521,8 +3556,8 @@ static void Gam_ShowBottonLeftColumnTch (struct Match *Match)
extern const char *Txt_Next_QUESTION;
extern const char *Txt_Finish;
extern const char *Txt_Answers;
extern const char *Txt_Start_match;
extern const char *Txt_Resume_match;
extern const char *Txt_Start;
extern const char *Txt_Resume;
unsigned NxtQstInd;
unsigned NumQsts;
@ -3571,8 +3606,42 @@ static void Gam_ShowBottonLeftColumnTch (struct Match *Match)
Gam_PutBigButton (ActCurMchTch,
Match->MchCod,
"play.svg",
Match->Status.QstInd == 0 ? Txt_Start_match :
Txt_Resume_match);
Match->Status.QstInd == 0 ? Txt_Start :
Txt_Resume);
fprintf (Gbl.F.Out,"</div>"
"</div>");
/***** End bottom left container *****/
fprintf (Gbl.F.Out,"</div>");
}
/*****************************************************************************/
/******** Show left botton column when playing a match (as a student) ********/
/*****************************************************************************/
static void Gam_ShowBottonLeftColumnStd (struct Match *Match)
{
extern const char *Txt_End;
unsigned NumQsts;
/***** Start bottom left container *****/
fprintf (Gbl.F.Out,"<div class=\"MATCH_BOTTOM_LEFT\">");
/***** Write number of question *****/
NumQsts = Gam_GetNumQstsGame (Match->GamCod);
fprintf (Gbl.F.Out,"<div class=\"MATCH_TCH_NUM_QST\">");
if (Match->Status.Finished)
fprintf (Gbl.F.Out,"%s",Txt_End);
else
fprintf (Gbl.F.Out,"%u/%u",Match->Status.QstInd,NumQsts);
fprintf (Gbl.F.Out,"</div>");
/***** Button *****/
fprintf (Gbl.F.Out,"<div class=\"MATCH_TCH_NXT_CONTAINER\">"
"<div class=\"MATCH_TCH_CONTINUE_CONTAINER\">");
if (Match->Status.Finished)
/* Put button to close browser tab */
Gam_PutBigButtonClose ();
fprintf (Gbl.F.Out,"</div>"
"</div>");
@ -3630,6 +3699,118 @@ static void Gam_ShowQuestionAndAnswersTch (struct Match *Match)
"MATCH_TCH_QST",false); // Don't show result
}
/*****************************************************************************/
/***** Show question and its answers when playing a match (as a student) *****/
/*****************************************************************************/
static void Gam_ShowQuestionAndAnswersStd (struct Match *Match)
{
bool Shuffle = false; // TODO: Read shuffle from question
MYSQL_RES *mysql_res;
MYSQL_ROW row;
int StdAnsInd;
unsigned NumOptions;
unsigned NumOpt;
unsigned Index;
bool ErrorInIndex = false;
/***** Show question *****/
fprintf (Gbl.F.Out,"<div class=\"MATCH_STD_QST_CONTAINER\">");
/* Write buttons for answers? */
if (Match->Status.ShowingAnswers)
{
if (Tst_CheckIfQuestionIsValidForGame (Match->Status.QstCod))
{
/***** Get student's answer to this question
(<0 ==> no answer) *****/
StdAnsInd = Gam_GetQstAnsFromDB (Match->MchCod,
Match->Status.QstInd);
/***** Get number of options in this question *****/
NumOptions = Tst_GetNumAnswersQst (Match->Status.QstCod);
/***** Get answers of question from database *****/
Shuffle = false;
NumOptions = Tst_GetAnswersQst (Match->Status.QstCod,&mysql_res,Shuffle);
/*
row[0] AnsInd
row[1] Answer
row[2] Feedback
row[3] MedCod
row[4] Correct
*/
/***** Start table *****/
Tbl_StartTableWide (8);
for (NumOpt = 0;
NumOpt < NumOptions;
NumOpt++)
{
/***** Get next answer *****/
row = mysql_fetch_row (mysql_res);
/***** Assign index (row[0]).
Index is 0,1,2,3... if no shuffle
or 1,3,0,2... (example) if shuffle *****/
if (sscanf (row[0],"%u",&Index) == 1)
{
if (Index >= Tst_MAX_OPTIONS_PER_QUESTION)
ErrorInIndex = true;
}
else
ErrorInIndex = true;
if (ErrorInIndex)
Lay_ShowErrorAndExit ("Wrong index of answer when showing a test.");
/***** Start row *****/
// if (NumOpt % 2 == 0)
fprintf (Gbl.F.Out,"<tr>");
/***** Write letter for this option *****/
/* Start table cell */
fprintf (Gbl.F.Out,"<td class=\"MATCH_STD_CELL\">");
/* Form with button.
Sumitting onmousedown instead of default onclick
is necessary in order to be fast
and not lose clicks due to refresh */
Frm_StartForm (ActAnsMchQstStd);
Gam_PutParamMatchCod (Match->MchCod); // Current match being played
Gam_PutParamQstInd (Match->Status.QstInd); // Current question index shown
Gam_PutParamAnswer (Index); // Index for this option
fprintf (Gbl.F.Out,"<button type=\"submit\""
" onmousedown=\"document.getElementById('%s').submit();"
"return false;\" class=\"",
Gbl.Form.Id);
if (StdAnsInd == (int) NumOpt) // Student's answer
fprintf (Gbl.F.Out,"MATCH_STD_ANSWER_SELECTED ");
fprintf (Gbl.F.Out,"MATCH_STD_BUTTON BT_%c\">"
"%c"
"</button>",
'A' + (char) NumOpt,
'a' + (char) NumOpt);
Frm_EndForm ();
/* End table cell */
fprintf (Gbl.F.Out,"</td>");
/***** End row *****/
// if (NumOpt % 2 == 1)
fprintf (Gbl.F.Out,"</tr>");
}
/***** End table *****/
Tbl_EndTable ();
}
else
Ale_ShowAlert (Ale_ERROR,"Type of answer not valid in a game.");
}
fprintf (Gbl.F.Out,"</div>");
}
/*****************************************************************************/
/*********************** Put a big button to do action ***********************/
/*****************************************************************************/
@ -3797,6 +3978,10 @@ void Gam_ShowMatchToMeAsStd (void)
{
struct Match Match;
/***** Remove old players.
This function must be called before getting match status. *****/
Gam_RemoveOldPlayers ();
/***** Get data of the match from database *****/
Match.MchCod = Gbl.Games.MchCodBeingPlayed;
Gam_GetDataOfMatchByCod (&Match);
@ -3845,6 +4030,10 @@ void Gam_RefreshMatchStd (void)
if (!Gbl.Session.IsOpen) // If session has been closed, do not write anything
return;
/***** Remove old players.
This function must be called before getting match status. *****/
Gam_RemoveOldPlayers ();
/***** Get data of the match from database *****/
Match.MchCod = Gbl.Games.MchCodBeingPlayed;
Gam_GetDataOfMatchByCod (&Match);
@ -3853,151 +4042,6 @@ void Gam_RefreshMatchStd (void)
Gam_ShowMatchStatusForStd (&Match);
}
/*****************************************************************************/
/************ Show current question being played for a student ***************/
/*****************************************************************************/
static void Gam_ShowMatchStatusForStd (struct Match *Match)
{
extern const char *Txt_Please_wait_;
bool IBelongToGroups;
bool Shuffle = false; // TODO: Read shuffle from question
MYSQL_RES *mysql_res;
MYSQL_ROW row;
int StdAnsInd;
unsigned NumOptions;
unsigned NumOpt;
unsigned Index;
bool ErrorInIndex = false;
/***** Do I belong to valid groups to play this match? *****/
IBelongToGroups = Gbl.Usrs.Me.IBelongToCurrentCrs &&
Gam_CheckIfIPlayThisMatchBasedOnGrps (Match->MchCod);
if (!IBelongToGroups)
Lay_ShowErrorAndExit ("You can not play this match!");
/***** Show current match status *****/
if (Match->Status.Finished)
Gam_ShowAlertFinishedMatch ();
else // Unfinished match
{
/***** Update players ******/
Gam_RegisterMeAsPlayerInMatch (Match->MchCod);
if (Match->Status.BeingPlayed)
{
/***** Show question *****/
/* Write number of question */
fprintf (Gbl.F.Out,"<div class=\"MATCH_STD_NUM_QST\">%u</div>",
Match->Status.QstInd);
fprintf (Gbl.F.Out,"<div class=\"MATCH_STD_QST_CONTAINER\">");
/* Write buttons for answers? */
if (Match->Status.ShowingAnswers)
{
if (Tst_CheckIfQuestionIsValidForGame (Match->Status.QstCod))
{
/***** Get student's answer to this question
(<0 ==> no answer) *****/
StdAnsInd = Gam_GetQstAnsFromDB (Match->MchCod,
Match->Status.QstInd);
/***** Get number of options in this question *****/
NumOptions = Tst_GetNumAnswersQst (Match->Status.QstCod);
/***** Get answers of question from database *****/
Shuffle = false;
NumOptions = Tst_GetAnswersQst (Match->Status.QstCod,&mysql_res,Shuffle);
/*
row[0] AnsInd
row[1] Answer
row[2] Feedback
row[3] MedCod
row[4] Correct
*/
/***** Start table *****/
Tbl_StartTableWide (8);
for (NumOpt = 0;
NumOpt < NumOptions;
NumOpt++)
{
/***** Get next answer *****/
row = mysql_fetch_row (mysql_res);
/***** Assign index (row[0]).
Index is 0,1,2,3... if no shuffle
or 1,3,0,2... (example) if shuffle *****/
if (sscanf (row[0],"%u",&Index) == 1)
{
if (Index >= Tst_MAX_OPTIONS_PER_QUESTION)
ErrorInIndex = true;
}
else
ErrorInIndex = true;
if (ErrorInIndex)
Lay_ShowErrorAndExit ("Wrong index of answer when showing a test.");
/***** Start row *****/
// if (NumOpt % 2 == 0)
fprintf (Gbl.F.Out,"<tr>");
/***** Write letter for this option *****/
/* Start table cell */
fprintf (Gbl.F.Out,"<td class=\"MATCH_STD_CELL\">");
/* Form with button.
Sumitting onmousedown instead of default onclick
is necessary in order to be fast
and not lose clicks due to refresh */
Frm_StartForm (ActAnsMchQstStd);
Gam_PutParamMatchCod (Match->MchCod); // Current match being played
Gam_PutParamQstInd (Match->Status.QstInd); // Current question index shown
Gam_PutParamAnswer (Index); // Index for this option
fprintf (Gbl.F.Out,"<button type=\"submit\""
" onmousedown=\"document.getElementById('%s').submit();"
"return false;\" class=\"",
Gbl.Form.Id);
if (StdAnsInd == (int) NumOpt) // Student's answer
fprintf (Gbl.F.Out,"MATCH_STD_ANSWER_SELECTED ");
fprintf (Gbl.F.Out,"MATCH_STD_BUTTON BT_%c\">"
"%c"
"</button>",
'A' + (char) NumOpt,
'a' + (char) NumOpt);
Frm_EndForm ();
/* End table cell */
fprintf (Gbl.F.Out,"</td>");
/***** End row *****/
// if (NumOpt % 2 == 1)
fprintf (Gbl.F.Out,"</tr>");
}
/***** End table *****/
Tbl_EndTable ();
}
else
Ale_ShowAlert (Ale_ERROR,"Type of answer not valid in a game.");
}
fprintf (Gbl.F.Out,"</div>");
}
else // Not being played
fprintf (Gbl.F.Out,"<div class=\"MATCH_STD_WAIT_CONTAINER\">"
"<img src=\"%s/wait.gif\""
" alt=\"%s\" title=\"%s\""
" class=\"MATCH_STD_WAIT_IMAGE\" />"
"</div>",
Cfg_URL_ICON_PUBLIC,
Txt_Please_wait_,
Txt_Please_wait_);
}
}
/*****************************************************************************/
/**** Receive previous question answer in a match question from database *****/
/*****************************************************************************/
@ -4041,6 +4085,10 @@ void Gam_ReceiveQstAnsFromStd (void)
unsigned StdAnsInd;
int PreviousStdAnsInd;
/***** Remove old players.
This function must be called before getting match status. *****/
Gam_RemoveOldPlayers ();
/***** Get data of the match from database *****/
Match.MchCod = Gbl.Games.MchCodBeingPlayed;
Gam_GetDataOfMatchByCod (&Match);

View File

@ -12267,7 +12267,7 @@ const char *Txt_Finish =
#elif L==9 // pt
"Terminar";
#endif
/*
const char *Txt_Finished_match =
#if L==1 // ca
"Partida finalitzada";
@ -12288,7 +12288,7 @@ const char *Txt_Finished_match =
#elif L==9 // pt
"Jogo terminado";
#endif
*/
const char *Txt_First_day_of_the_week =
#if L==1 // ca
"Primer dia de la setmana";
@ -33193,25 +33193,25 @@ const char *Txt_results_per_page =
"resultados por p&aacute;gina";
#endif
const char *Txt_Resume_match =
const char *Txt_Resume =
#if L==1 // ca
"Reprendre partida";
"Reprendre";
#elif L==2 // de
"Spiel fortsetzen";
"Fortsetzen";
#elif L==3 // en
"Resume match";
"Resume";
#elif L==4 // es
"Reanudar partida";
"Reanudar";
#elif L==5 // fr
"Reprendre le match";
"Reprendre";
#elif L==6 // gn
"Reanudar partida"; // Okoteve traducción
"Reanudar"; // Okoteve traducción
#elif L==7 // it
"Riprendi la partita";
"Riprendi";
#elif L==8 // pl
"Wzn&oacute;w mecz";
"Wzn&oacute;w";
#elif L==9 // pt
"Retomar o jogo";
"Retomar";
#endif
const char *Txt_Retype_new_password =
@ -41245,25 +41245,25 @@ const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES] =
#endif
};
const char *Txt_Start_match =
const char *Txt_Start =
#if L==1 // ca
"Comen&ccedil;ar partida";
"Comen&ccedil;ar";
#elif L==2 // de
"Spiel starten";
"Starten";
#elif L==3 // en
"Start match";
"Start";
#elif L==4 // es
"Comenzar partida";
"Comenzar";
#elif L==5 // fr
"Commencer le match";
"Commencer";
#elif L==6 // gn
"&Ntilde;epyr&utilde; &ntilde;embosar&aacute;i";
"&Ntilde;epyr&utilde;";
#elif L==7 // it
"Inizia la partita";
"Inizia";
#elif L==8 // pl
"Rozpocznij mecz";
"Rozpocznij";
#elif L==9 // pt
"Come&ccedil;ar o jogo";
"Come&ccedil;ar";
#endif
const char *Txt_Statistic =