Version 16.107

This commit is contained in:
Antonio Cañas Vargas 2016-12-26 15:17:30 +01:00
parent 780b55c17e
commit ea97a58cae
3 changed files with 119 additions and 93 deletions

View File

@ -183,18 +183,21 @@
// TODO: Draw future dates in attendance, surveys, assignments in blue? // TODO: Draw future dates in attendance, surveys, assignments in blue?
// TODO: Fix bug in generate a test: after entering a number of questions with empty tags and type of answers, number of questions is not remembered // TODO: Fix bug in generate a test: after entering a number of questions with empty tags and type of answers, number of questions is not remembered
// TODO: Fix big when editing a test question with images: when "Change image" is selected but no image is uploades, other images (for example in answers) are lost
/*****************************************************************************/ /*****************************************************************************/
/****************************** Public constants *****************************/ /****************************** Public constants *****************************/
/*****************************************************************************/ /*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 16.106.20 (2016-12-26)" #define Log_PLATFORM_VERSION "SWAD 16.107 (2016-12-26)"
#define CSS_FILE "swad16.106.5.css" #define CSS_FILE "swad16.106.5.css"
#define JS_FILE "swad16.101.js" #define JS_FILE "swad16.101.js"
// Number of lines (includes comments but not blank lines) has been got with the following command: // Number of lines (includes comments but not blank lines) has been got with the following command:
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1 // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1
/* /*
Version 16.107: Dec 26, 2016 Changes in behaviour of labels in forms.
Code refactoring in tests. (211510 lines)
Version 16.106.20:Dec 26, 2016 Changes in warning about next time to take a test. (211486 lines) Version 16.106.20:Dec 26, 2016 Changes in warning about next time to take a test. (211486 lines)
Version 16.106.19:Dec 26, 2016 Changes in login form (autofocus). (211494 lines) Version 16.106.19:Dec 26, 2016 Changes in login form (autofocus). (211494 lines)
Version 16.106.18:Dec 25, 2016 Changes in behaviour of labels in forms. (211496 lines) Version 16.106.18:Dec 25, 2016 Changes in behaviour of labels in forms. (211496 lines)

View File

@ -172,6 +172,8 @@ static void Tst_ShowFormEditTags (void);
static void Tst_PutIconEnable (long TagCod,const char *TagTxt); static void Tst_PutIconEnable (long TagCod,const char *TagTxt);
static void Tst_PutIconDisable (long TagCod,const char *TagTxt); static void Tst_PutIconDisable (long TagCod,const char *TagTxt);
static void Tst_ShowFormConfigTst (void); static void Tst_ShowFormConfigTst (void);
static void Tst_PutInputFieldNumQst (const char *Field,const char *Label,
unsigned Value);
static void Tst_GetConfigTstFromDB (void); static void Tst_GetConfigTstFromDB (void);
static Tst_Pluggable_t Tst_GetPluggableFromForm (void); static Tst_Pluggable_t Tst_GetPluggableFromForm (void);
static Tst_Feedback_t Tst_GetFeedbackTypeFromForm (void); static Tst_Feedback_t Tst_GetFeedbackTypeFromForm (void);
@ -214,6 +216,8 @@ static bool Tst_GetCreateXMLFromForm (void);
static int Tst_CountNumTagsInList (void); static int Tst_CountNumTagsInList (void);
static int Tst_CountNumAnswerTypesInList (void); static int Tst_CountNumAnswerTypesInList (void);
static void Tst_PutFormEditOneQst (char *Stem,char *Feedback); static void Tst_PutFormEditOneQst (char *Stem,char *Feedback);
static void Tst_PutFloatInputField (const char *Label,const char *Field,
double Value);
static void Tst_FreeTextChoiceAnswers (void); static void Tst_FreeTextChoiceAnswers (void);
static void Tst_FreeTextChoiceAnswer (unsigned NumOpt); static void Tst_FreeTextChoiceAnswer (unsigned NumOpt);
@ -1830,18 +1834,21 @@ static void Tst_ShowFormConfigTst (void)
"<td class=\"%s RIGHT_TOP\">" "<td class=\"%s RIGHT_TOP\">"
"%s:" "%s:"
"</td>" "</td>"
"<td class=\"LEFT_TOP\">", "<td class=\"LEFT_BOTTOM\">",
The_ClassForm[Gbl.Prefs.Theme], The_ClassForm[Gbl.Prefs.Theme],
Txt_Plugins); Txt_Plugins);
for (Pluggable = Tst_PLUGGABLE_NO; for (Pluggable = Tst_PLUGGABLE_NO;
Pluggable <= Tst_PLUGGABLE_YES; Pluggable <= Tst_PLUGGABLE_YES;
Pluggable++) Pluggable++)
{ {
fprintf (Gbl.F.Out,"<input type=\"radio\" name=\"Pluggable\" value=\"%u\"", fprintf (Gbl.F.Out,"<label class=\"DAT\">"
"<input type=\"radio\" name=\"Pluggable\" value=\"%u\"",
(unsigned) Pluggable); (unsigned) Pluggable);
if (Pluggable == Gbl.Test.Config.Pluggable) if (Pluggable == Gbl.Test.Config.Pluggable)
fprintf (Gbl.F.Out," checked=\"checked\""); fprintf (Gbl.F.Out," checked=\"checked\"");
fprintf (Gbl.F.Out," /><span class=\"DAT\">%s</span><br />", fprintf (Gbl.F.Out," />"
"%s"
"</label><br />",
Txt_TST_PLUGGABLE[Pluggable]); Txt_TST_PLUGGABLE[Pluggable]);
} }
fprintf (Gbl.F.Out,"</td>" fprintf (Gbl.F.Out,"</td>"
@ -1852,60 +1859,30 @@ static void Tst_ShowFormConfigTst (void)
"<td class=\"%s RIGHT_TOP\">" "<td class=\"%s RIGHT_TOP\">"
"%s:" "%s:"
"</td>" "</td>"
"<td class=\"LEFT_TOP\">" "<td class=\"LEFT_BOTTOM\">"
"<table style=\"border-spacing:2px;\">", "<table style=\"border-spacing:2px;\">",
The_ClassForm[Gbl.Prefs.Theme], The_ClassForm[Gbl.Prefs.Theme],
Txt_No_of_questions); Txt_No_of_questions);
Tst_PutInputFieldNumQst ("NumQstMin",Txt_minimum,
/* Minimum number of questions in a test */ Gbl.Test.Config.Min); // Minimum number of questions
fprintf (Gbl.F.Out,"<tr>" Tst_PutInputFieldNumQst ("NumQstDef",Txt_default,
"<td class=\"DAT RIGHT_MIDDLE\">" Gbl.Test.Config.Def); // Default number of questions
"%s" Tst_PutInputFieldNumQst ("NumQstMax",Txt_maximum,
"</td>" Gbl.Test.Config.Max); // Maximum number of questions
"<td class=\"LEFT_MIDDLE\">" fprintf (Gbl.F.Out,"</table>"
"<input type=\"text\" name=\"NumQstMin\""
" size=\"3\" maxlength=\"3\" value=\"%u\""
" required=\"required\" />"
"</td>" "</td>"
"</tr>", "</tr>");
Txt_minimum,Gbl.Test.Config.Min);
/* Default number of questions in a test */
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"DAT RIGHT_MIDDLE\">"
"%s"
"</td>"
"<td class=\"LEFT_MIDDLE\">"
"<input type=\"text\" name=\"NumQstDef\""
" size=\"3\" maxlength=\"3\" value=\"%u\""
" required=\"required\" />"
"</td>"
"</tr>",
Txt_default,Gbl.Test.Config.Def);
/* Maximum number of questions in a test */
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"DAT RIGHT_MIDDLE\">"
"%s"
"</td>"
"<td class=\"LEFT_MIDDLE\">"
"<input type=\"text\" name=\"NumQstMax\""
" size=\"3\" maxlength=\"3\" value=\"%u\""
" required=\"required\" />"
"</td>"
"</tr>"
"</table>"
"</td>"
"</tr>",
Txt_maximum,Gbl.Test.Config.Max);
/***** Minimum time between consecutive tests, per question *****/ /***** Minimum time between consecutive tests, per question *****/
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
"<td class=\"%s RIGHT_MIDDLE\">" "<td class=\"RIGHT_TOP\">"
"<label for=\"MinTimeNxtTstPerQst\" class=\"%s\">"
"%s:" "%s:"
"</label>"
"</td>" "</td>"
"<td class=\"LEFT_MIDDLE\">" "<td class=\"LEFT_BOTTOM\">"
"<input type=\"text\" name=\"MinTimeNxtTstPerQst\"" "<input type=\"text\""
" id=\"MinTimeNxtTstPerQst\" name=\"MinTimeNxtTstPerQst\""
" size=\"7\" maxlength=\"7\" value=\"%lu\"" " size=\"7\" maxlength=\"7\" value=\"%lu\""
" required=\"required\" />" " required=\"required\" />"
"</td>" "</td>"
@ -1919,17 +1896,20 @@ static void Tst_ShowFormConfigTst (void)
"<td class=\"%s RIGHT_TOP\">" "<td class=\"%s RIGHT_TOP\">"
"%s:" "%s:"
"</td>" "</td>"
"<td class=\"LEFT_TOP\">", "<td class=\"LEFT_BOTTOM\">",
The_ClassForm[Gbl.Prefs.Theme],Txt_Feedback_to_students); The_ClassForm[Gbl.Prefs.Theme],Txt_Feedback_to_students);
for (FeedbTyp = (Tst_Feedback_t) 0; for (FeedbTyp = (Tst_Feedback_t) 0;
FeedbTyp < Tst_NUM_TYPES_FEEDBACK; FeedbTyp < Tst_NUM_TYPES_FEEDBACK;
FeedbTyp++) FeedbTyp++)
{ {
fprintf (Gbl.F.Out,"<input type=\"radio\" name=\"Feedback\" value=\"%u\"", fprintf (Gbl.F.Out,"<label class=\"DAT\">"
"<input type=\"radio\" name=\"Feedback\" value=\"%u\"",
(unsigned) FeedbTyp); (unsigned) FeedbTyp);
if (FeedbTyp == Gbl.Test.Config.FeedbackType) if (FeedbTyp == Gbl.Test.Config.FeedbackType)
fprintf (Gbl.F.Out," checked=\"checked\""); fprintf (Gbl.F.Out," checked=\"checked\"");
fprintf (Gbl.F.Out," /><span class=\"DAT\">%s</span><br />", fprintf (Gbl.F.Out," />"
"%s"
"</label><br />",
Txt_TST_STR_FEEDBACK[FeedbTyp]); Txt_TST_STR_FEEDBACK[FeedbTyp]);
} }
fprintf (Gbl.F.Out,"</td>" fprintf (Gbl.F.Out,"</td>"
@ -1950,6 +1930,29 @@ static void Tst_ShowFormConfigTst (void)
/*************** Get configuration of test for current course ****************/ /*************** Get configuration of test for current course ****************/
/*****************************************************************************/ /*****************************************************************************/
static void Tst_PutInputFieldNumQst (const char *Field,const char *Label,
unsigned Value)
{
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"RIGHT_MIDDLE\">"
"<label for=\"%s\" class=\"DAT\">%s</label>"
"</td>"
"<td class=\"LEFT_MIDDLE\">"
"<input type=\"text\""
" id=\"%s\" name=\"%s\""
" size=\"3\" maxlength=\"3\" value=\"%u\""
" required=\"required\" />"
"</td>"
"</tr>",
Field,Label,
Field,Field,
Value);
}
/*****************************************************************************/
/*************** Get configuration of test for current course ****************/
/*****************************************************************************/
static void Tst_GetConfigTstFromDB (void) static void Tst_GetConfigTstFromDB (void)
{ {
char Query[512]; char Query[512];
@ -3394,20 +3397,29 @@ static void Tst_WriteChoiceAnsViewTest (unsigned NumQst,long QstCod,bool Shuffle
Par_PutHiddenParamUnsigned (ParamName,Index); Par_PutHiddenParamUnsigned (ParamName,Index);
fprintf (Gbl.F.Out,"<input type=\""); fprintf (Gbl.F.Out,"<input type=\"");
if (Gbl.Test.AnswerType == Tst_ANS_UNIQUE_CHOICE) if (Gbl.Test.AnswerType == Tst_ANS_UNIQUE_CHOICE)
fprintf (Gbl.F.Out,"radio\" onclick=\"selectUnselectRadio(this,this.form.Ans%06u,%u);\"", fprintf (Gbl.F.Out,"radio\""
" onclick=\"selectUnselectRadio(this,this.form.Ans%06u,%u);\"",
NumQst,Gbl.Test.Answer.NumOptions); NumQst,Gbl.Test.Answer.NumOptions);
else // Gbl.Test.AnswerType == Tst_ANS_MULTIPLE_CHOICE else // Gbl.Test.AnswerType == Tst_ANS_MULTIPLE_CHOICE
fprintf (Gbl.F.Out,"checkbox\""); fprintf (Gbl.F.Out,"checkbox\"");
fprintf (Gbl.F.Out," name=\"Ans%06u\" value=\"%u\" /> </td>", fprintf (Gbl.F.Out," id=\"Ans%06u_%u\" name=\"Ans%06u\" value=\"%u\" />"
NumQst,Index);
fprintf (Gbl.F.Out,"<td class=\"TEST LEFT_TOP\">"
"%c)&nbsp;"
"</td>", "</td>",
'a' + (char) NumOpt); NumQst,NumOpt,
NumQst,Index);
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP\">"
"<label for=\"Ans%06u_%u\" class=\"TEST\">"
"%c)&nbsp;"
"</label>"
"</td>",
NumQst,NumOpt,
'a' + (char) NumOpt);
/***** Write the option text *****/ /***** Write the option text *****/
fprintf (Gbl.F.Out,"<td class=\"TEST_EXA LEFT_TOP\">" fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP\">"
"%s", "<label for=\"Ans%06u_%u\" class=\"TEST_EXA\">"
"%s"
"</label>",
NumQst,NumOpt,
Gbl.Test.Answer.Options[NumOpt].Text); Gbl.Test.Answer.Options[NumOpt].Text);
Img_ShowImage (&Gbl.Test.Answer.Options[NumOpt].Image, Img_ShowImage (&Gbl.Test.Answer.Options[NumOpt].Image,
"TEST_IMG_SHOW_ANS_CONTAINER", "TEST_IMG_SHOW_ANS_CONTAINER",
@ -4618,14 +4630,13 @@ static void Tst_PutFormEditOneQst (char *Stem,char *Feedback)
/***** Answers *****/ /***** Answers *****/
/* Integer answer */ /* Integer answer */
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
"<td class=\"RIGHT_TOP\">" "<td class=\"RIGHT_TOP %s\">"
"<label for=\"AnsInt\" class=\"%s\">"
"%s:" "%s:"
"</label>"
"</td>" "</td>"
"<td class=\"%s LEFT_TOP\">" "<td class=\"LEFT_TOP\">"
"%s: " "<label class=\"%s\">"
"<input type=\"text\" id=\"AnsInt\" name=\"AnsInt\"" "%s:&nbsp;"
"<input type=\"text\" name=\"AnsInt\""
" size=\"11\" maxlength=\"11\" value=\"%ld\"", " size=\"11\" maxlength=\"11\" value=\"%ld\"",
The_ClassForm[Gbl.Prefs.Theme],Txt_Answers, The_ClassForm[Gbl.Prefs.Theme],Txt_Answers,
The_ClassForm[Gbl.Prefs.Theme],Txt_Integer_number, The_ClassForm[Gbl.Prefs.Theme],Txt_Integer_number,
@ -4633,30 +4644,19 @@ static void Tst_PutFormEditOneQst (char *Stem,char *Feedback)
if (Gbl.Test.AnswerType != Tst_ANS_INT) if (Gbl.Test.AnswerType != Tst_ANS_INT)
fprintf (Gbl.F.Out," disabled=\"disabled\""); fprintf (Gbl.F.Out," disabled=\"disabled\"");
fprintf (Gbl.F.Out," required=\"required\" />" fprintf (Gbl.F.Out," required=\"required\" />"
"</label>"
"</td>" "</td>"
"</tr>"); "</tr>");
/* Floating point answer */ /* Floating point answer */
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
"<td></td>" "<td></td>"
"<td class=\"%s LEFT_TOP\">" "<td class=\"LEFT_TOP\">");
"%s " Tst_PutFloatInputField (Txt_Real_number_between_A_and_B_1,"AnsFloatMin",
"<input type=\"text\" name=\"AnsFloatMin\"" Gbl.Test.Answer.FloatingPoint[0]);
" size=\"11\" maxlength=\"%u\" value=\"%lg\"", Tst_PutFloatInputField (Txt_Real_number_between_A_and_B_2,"AnsFloatMax",
The_ClassForm[Gbl.Prefs.Theme],Txt_Real_number_between_A_and_B_1, Gbl.Test.Answer.FloatingPoint[1]);
Tst_MAX_BYTES_FLOAT_ANSWER,Gbl.Test.Answer.FloatingPoint[0]); fprintf (Gbl.F.Out,"</td>"
if (Gbl.Test.AnswerType != Tst_ANS_FLOAT)
fprintf (Gbl.F.Out," disabled=\"disabled\"");
fprintf (Gbl.F.Out," required=\"required\" />"
" %s "
"<input type=\"text\" name=\"AnsFloatMax\""
" size=\"11\" maxlength=\"%u\" value=\"%lg\"",
Txt_Real_number_between_A_and_B_2,
Tst_MAX_BYTES_FLOAT_ANSWER,Gbl.Test.Answer.FloatingPoint[1]);
if (Gbl.Test.AnswerType != Tst_ANS_FLOAT)
fprintf (Gbl.F.Out," disabled=\"disabled\"");
fprintf (Gbl.F.Out," required=\"required\" />"
"</td>"
"</tr>"); "</tr>");
/* T/F answer */ /* T/F answer */
@ -4851,6 +4851,29 @@ static void Tst_PutFormEditOneQst (char *Stem,char *Feedback)
Lay_EndRoundFrame (); Lay_EndRoundFrame ();
} }
/*****************************************************************************/
/********************* Put input field for floating answer *******************/
/*****************************************************************************/
static void Tst_PutFloatInputField (const char *Label,const char *Field,
double Value)
{
extern const char *The_ClassForm[The_NUM_THEMES];
fprintf (Gbl.F.Out,"<label class=\"%s\">%s&nbsp;"
"<input type=\"text\" name=\"%s\""
" size=\"11\" maxlength=\"%u\""
" value=\"%lg\"",
The_ClassForm[Gbl.Prefs.Theme],Label,
Field,
Tst_MAX_BYTES_FLOAT_ANSWER,
Value);
if (Gbl.Test.AnswerType != Tst_ANS_FLOAT)
fprintf (Gbl.F.Out," disabled=\"disabled\"");
fprintf (Gbl.F.Out," required=\"required\" />"
"</label>");
}
/*****************************************************************************/ /*****************************************************************************/
/********************* Initialize a new question to zero *********************/ /********************* Initialize a new question to zero *********************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -29927,23 +29927,23 @@ const char *Txt_Real_number_between_A_and_B_1 =
const char *Txt_Real_number_between_A_and_B_2 = const char *Txt_Real_number_between_A_and_B_2 =
#if L==1 #if L==1
"y"; // Necessita traduccio " i";
#elif L==2 #elif L==2
"und"; " und";
#elif L==3 #elif L==3
"and"; " and";
#elif L==4 #elif L==4
"y"; " y";
#elif L==5 #elif L==5
"et"; " et";
#elif L==6 #elif L==6
"y"; // Okoteve traducción " y"; // Okoteve traducción
#elif L==7 #elif L==7
"e"; " e";
#elif L==8 #elif L==8
"i"; " i";
#elif L==9 #elif L==9
"e"; " e";
#endif #endif
const char *Txt_Recommended_aspect_ratio = const char *Txt_Recommended_aspect_ratio =