diff --git a/swad_changelog.h b/swad_changelog.h
index c147158b7..12f75ccb6 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -252,15 +252,16 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
-#define Log_PLATFORM_VERSION "SWAD 17.11.5 (2017-10-01)"
+#define Log_PLATFORM_VERSION "SWAD 17.11.6 (2017-10-01)"
#define CSS_FILE "swad17.0.css"
#define JS_FILE "swad16.206.3.js"
// 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
/*
+ Version 17.11.6: Oct 01, 2017 Fixed bug in edition of projects. (231632 lines)
Version 17.11.5: Oct 01, 2017 Changes in order of roles in projects.
- Changes in edition of assignments, surveys and attendance events. (231536 lines)
+ Changes in edition of assignments, games, surveys and attendance events. (231536 lines)
Version 17.11.4: Sep 30, 2017 Changes in edition of a project. (231521 lines)
Version 17.11.3: Sep 30, 2017 Changes in layout of projects. (231517 lines)
Version 17.11.2: Sep 30, 2017 Changes in layout of projects. (231511 lines)
diff --git a/swad_game.c b/swad_game.c
index 664665d57..d0e3c1ae6 100644
--- a/swad_game.c
+++ b/swad_game.c
@@ -1782,7 +1782,10 @@ void Gam_RequestCreatOrEditGame (void)
Box_StartBoxTable (NULL,Txt_New_game,NULL,
Hlp_ASSESSMENT_Games_new_game,Box_NOT_CLOSABLE,2);
else
- Box_StartBoxTable (NULL,Txt_Edit_game,NULL,
+ Box_StartBoxTable (NULL,
+ Game.Title[0] ? Game.Title :
+ Txt_Edit_game,
+ NULL,
Hlp_ASSESSMENT_Games_edit_game,Box_NOT_CLOSABLE,2);
/***** Scope of the game *****/
diff --git a/swad_project.c b/swad_project.c
index e769b4da7..16bfe0a89 100644
--- a/swad_project.c
+++ b/swad_project.c
@@ -647,6 +647,9 @@ static void Prj_ShowOneProject (struct Project *Prj,Prj_ProjectView_t ProjectVie
/* Department */
Prj_ShowOneProjectDepartment (Prj,ProjectView);
+ /***** Project members *****/
+ Prj_ShowOneProjectMembers (Prj,ProjectView);
+
/***** Write rows of data of this project *****/
/* Description of the project */
Prj_ShowOneProjectTxtField (Prj,ProjectView,
@@ -686,9 +689,6 @@ static void Prj_ShowOneProject (struct Project *Prj,Prj_ProjectView_t ProjectVie
(Prj->Preassigned == Prj_PREASSIGNED) ? Txt_Yes :
Txt_No);
- /* Project members */
- Prj_ShowOneProjectMembers (Prj,ProjectView);
-
Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd;
}
@@ -981,24 +981,26 @@ static void Prj_ShowOneProjectMembersWithARole (const struct Project *Prj,
Prj_ProjectView_t ProjectView,
Prj_RoleInProject_t RoleInProject)
{
+ extern const char *Txt_PROJECT_ROLES_SINGUL_Abc[Prj_NUM_ROLES_IN_PROJECT];
extern const char *Txt_PROJECT_ROLES_PLURAL_Abc[Prj_NUM_ROLES_IN_PROJECT];
extern const char *Txt_Remove;
extern const char *Txt_Add_USER;
extern const char *Txt_PROJECT_ROLES_SINGUL_abc[Prj_NUM_ROLES_IN_PROJECT];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
+ bool WriteRow;
unsigned NumUsr;
unsigned NumUsrs;
bool ShowPhoto;
char PhotoURL[PATH_MAX + 1];
- static Act_Action_t ActionReqRemUsr[Prj_NUM_ROLES_IN_PROJECT] =
+ static const Act_Action_t ActionReqRemUsr[Prj_NUM_ROLES_IN_PROJECT] =
{
ActUnk, // Prj_ROLE_UNK, Unknown
ActReqRemStdPrj, // Prj_ROLE_STD, Student
ActReqRemTutPrj, // Prj_ROLE_TUT, Tutor
ActReqRemEvaPrj, // Prj_ROLE_EVA, Evaluator
};
- static Act_Action_t ActionReqAddUsr[Prj_NUM_ROLES_IN_PROJECT] =
+ static const Act_Action_t ActionReqAddUsr[Prj_NUM_ROLES_IN_PROJECT] =
{
ActUnk, // Prj_ROLE_UNK, Unknown
ActReqAddStdPrj, // Prj_ROLE_STD, Student
@@ -1008,121 +1010,129 @@ static void Prj_ShowOneProjectMembersWithARole (const struct Project *Prj,
/***** Get users in project from database *****/
NumUsrs = Prj_GetUsrsInPrj (Prj->PrjCod,RoleInProject,&mysql_res);
+ WriteRow = (NumUsrs != 0 ||
+ ProjectView == Prj_EDIT_ONE_PROJECT);
- /***** Start row with label and listing of users *****/
- fprintf (Gbl.F.Out,"
");
- switch (ProjectView)
+ if (WriteRow)
{
- case Prj_LIST_PROJECTS:
- fprintf (Gbl.F.Out,"%s: | "
- "",
- Gbl.RowEvenOdd,
- Prj->Hidden ? "ASG_LABEL_LIGHT" :
- "ASG_LABEL",
- Txt_PROJECT_ROLES_PLURAL_Abc[RoleInProject],
- Gbl.RowEvenOdd,
- Prj->Hidden ? "DAT_LIGHT" :
- "DAT");
- break;
- case Prj_PRINT_ONE_PROJECT:
- fprintf (Gbl.F.Out," | %s: | "
- "",
- Prj->Hidden ? "ASG_LABEL_LIGHT" :
- "ASG_LABEL",
- Txt_PROJECT_ROLES_PLURAL_Abc[RoleInProject],
- Prj->Hidden ? "DAT_LIGHT" :
- "DAT");
- break;
- case Prj_EDIT_ONE_PROJECT:
- fprintf (Gbl.F.Out," | %s: | "
- "",
- Txt_PROJECT_ROLES_PLURAL_Abc[RoleInProject]);
- break;
- }
+ /***** Start row with label and listing of users *****/
+ fprintf (Gbl.F.Out," |
");
- /***** Start table with all members with this role *****/
- Tbl_StartTable (2);
-
- /***** Write users *****/
- for (NumUsr = 0;
- NumUsr < NumUsrs;
- NumUsr++)
- {
- /* Get user's code */
- row = mysql_fetch_row (mysql_res);
- Gbl.Usrs.Other.UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[0]);
-
- /* Get user's data */
- if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat))
+ switch (ProjectView)
{
- /* Start row for this user */
- fprintf (Gbl.F.Out,"
");
-
- /* Icon to remove user */
- if (ProjectView == Prj_EDIT_ONE_PROJECT)
- {
- fprintf (Gbl.F.Out,"");
- Lay_PutContextualLink (ActionReqRemUsr[RoleInProject],NULL,Prj_PutParams,
- "remove-on64x64.png",
- Txt_Remove,NULL,
- NULL);
- fprintf (Gbl.F.Out," | ");
- }
-
- /* Put user's photo */
- fprintf (Gbl.F.Out,"");
- ShowPhoto = Pho_ShowingUsrPhotoIsAllowed (&Gbl.Usrs.Other.UsrDat,PhotoURL);
- Pho_ShowUsrPhoto (&Gbl.Usrs.Other.UsrDat,ShowPhoto ? PhotoURL :
- NULL,
- "PHOTO21x28",Pho_ZOOM,false);
- fprintf (Gbl.F.Out," | ");
-
- /* Write user's IDs */
- if (RoleInProject == Prj_ROLE_STD)
- {
- fprintf (Gbl.F.Out,"");
- ID_WriteUsrIDs (&Gbl.Usrs.Other.UsrDat,NULL);
- fprintf (Gbl.F.Out," | ");
- }
-
- /* Write user's name */
- fprintf (Gbl.F.Out,"%s | ",
- Gbl.Usrs.Other.UsrDat.FullName);
-
- /* End row for this user */
- fprintf (Gbl.F.Out,"
");
+ case Prj_LIST_PROJECTS:
+ fprintf (Gbl.F.Out,"%s: | "
+ "",
+ Gbl.RowEvenOdd,
+ Prj->Hidden ? "ASG_LABEL_LIGHT" :
+ "ASG_LABEL",
+ NumUsrs == 1 ? Txt_PROJECT_ROLES_SINGUL_Abc[RoleInProject] :
+ Txt_PROJECT_ROLES_PLURAL_Abc[RoleInProject],
+ Gbl.RowEvenOdd,
+ Prj->Hidden ? "DAT_LIGHT" :
+ "DAT");
+ break;
+ case Prj_PRINT_ONE_PROJECT:
+ fprintf (Gbl.F.Out," | %s: | "
+ "",
+ Prj->Hidden ? "ASG_LABEL_LIGHT" :
+ "ASG_LABEL",
+ NumUsrs == 1 ? Txt_PROJECT_ROLES_SINGUL_Abc[RoleInProject] :
+ Txt_PROJECT_ROLES_PLURAL_Abc[RoleInProject],
+ Prj->Hidden ? "DAT_LIGHT" :
+ "DAT");
+ break;
+ case Prj_EDIT_ONE_PROJECT:
+ fprintf (Gbl.F.Out," | %s: | "
+ "",
+ Txt_PROJECT_ROLES_PLURAL_Abc[RoleInProject]);
+ break;
}
- }
- /***** Row to add a new user *****/
- if (ProjectView == Prj_EDIT_ONE_PROJECT)
- {
- fprintf (Gbl.F.Out," | "
- "");
- Gbl.Prjs.PrjCodToEdit = Prj->PrjCod; // Used to pass project code as a parameter
- sprintf (Gbl.Title,Txt_Add_USER,Txt_PROJECT_ROLES_SINGUL_abc[RoleInProject]);
- Lay_PutContextualLink (ActionReqAddUsr[RoleInProject],NULL,Prj_PutParams,
- "plus64x64.png",
- Gbl.Title,NULL,
- NULL);
+ /***** Start table with all members with this role *****/
+ Tbl_StartTable (2);
+
+ /***** Write users *****/
+ for (NumUsr = 0;
+ NumUsr < NumUsrs;
+ NumUsr++)
+ {
+ /* Get user's code */
+ row = mysql_fetch_row (mysql_res);
+ Gbl.Usrs.Other.UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[0]);
+
+ /* Get user's data */
+ if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat))
+ {
+ /* Start row for this user */
+ fprintf (Gbl.F.Out," |
");
+
+ /* Icon to remove user */
+ if (ProjectView == Prj_EDIT_ONE_PROJECT)
+ {
+ fprintf (Gbl.F.Out,"");
+ Lay_PutContextualLink (ActionReqRemUsr[RoleInProject],NULL,Prj_PutParams,
+ "remove-on64x64.png",
+ Txt_Remove,NULL,
+ NULL);
+ fprintf (Gbl.F.Out," | ");
+ }
+
+ /* Put user's photo */
+ fprintf (Gbl.F.Out,"");
+ ShowPhoto = Pho_ShowingUsrPhotoIsAllowed (&Gbl.Usrs.Other.UsrDat,PhotoURL);
+ Pho_ShowUsrPhoto (&Gbl.Usrs.Other.UsrDat,ShowPhoto ? PhotoURL :
+ NULL,
+ "PHOTO21x28",Pho_ZOOM,false);
+ fprintf (Gbl.F.Out," | ");
+
+ /* Write user's IDs */
+ if (RoleInProject == Prj_ROLE_STD)
+ {
+ fprintf (Gbl.F.Out,"");
+ ID_WriteUsrIDs (&Gbl.Usrs.Other.UsrDat,NULL);
+ fprintf (Gbl.F.Out," | ");
+ }
+
+ /* Write user's name */
+ fprintf (Gbl.F.Out,"%s | ",
+ Gbl.Usrs.Other.UsrDat.FullName);
+
+ /* End row for this user */
+ fprintf (Gbl.F.Out,"
");
+ }
+ }
+
+ /***** Row to add a new user *****/
+ if (ProjectView == Prj_EDIT_ONE_PROJECT)
+ {
+ fprintf (Gbl.F.Out,""
+ "");
+ Gbl.Prjs.PrjCodToEdit = Prj->PrjCod; // Used to pass project code as a parameter
+ sprintf (Gbl.Title,Txt_Add_USER,Txt_PROJECT_ROLES_SINGUL_abc[RoleInProject]);
+ Lay_PutContextualLink (ActionReqAddUsr[RoleInProject],NULL,Prj_PutParams,
+ "plus64x64.png",
+ Gbl.Title,NULL,
+ NULL);
+ fprintf (Gbl.F.Out," | "
+ "" // Column for photo
+ " | ");
+ if (RoleInProject == Prj_ROLE_STD)
+ fprintf (Gbl.F.Out," | "); // Column for user's IDs
+ fprintf (Gbl.F.Out," | " // Column for name
+ "
");
+ }
+
+ /***** End table with all members with this role *****/
+ Tbl_EndTable ();
+
+ /***** End row with label and listing of users *****/
fprintf (Gbl.F.Out,""
- "" // Column for photo
- " | ");
- if (RoleInProject == Prj_ROLE_STD)
- fprintf (Gbl.F.Out," | "); // Column for user's IDs
- fprintf (Gbl.F.Out," | " // Column for name
- "");
+ "");
}
- /***** End table with all members with this role *****/
- Tbl_EndTable ();
-
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
-
- /***** End row with label and listing of users *****/
- fprintf (Gbl.F.Out,""
- "");
}
static void Prj_ShowTableAllProjectsMembersWithARole (const struct Project *Prj,
@@ -2180,25 +2190,22 @@ static void Prj_PutFormProject (struct Project *Prj,bool ItsANewProject)
extern const char *Txt_Members;
unsigned NumRoleToShow;
- /***** Start box and form *****/
+ /***** Start project box *****/
if (ItsANewProject)
{
+ Gbl.Prjs.PrjCodToEdit = -1L;
Box_StartBox (NULL,Txt_New_project,NULL,
Hlp_ASSESSMENT_Projects_new_project,Box_NOT_CLOSABLE);
- Act_FormStart (ActNewPrj);
- Gbl.Prjs.PrjCodToEdit = -1L;
}
else
{
+ Gbl.Prjs.PrjCodToEdit = Prj->PrjCod;
Box_StartBox (NULL,
Prj->Title[0] ? Prj->Title :
Txt_Edit_project,
NULL,
Hlp_ASSESSMENT_Projects_edit_project,Box_NOT_CLOSABLE);
- Act_FormStart (ActChgPrj);
- Gbl.Prjs.PrjCodToEdit = Prj->PrjCod;
}
- Prj_PutParams ();
/***** 1. Project members *****/
if (!ItsANewProject) // Existing project
@@ -2214,6 +2221,11 @@ static void Prj_PutFormProject (struct Project *Prj,bool ItsANewProject)
}
/***** 2. Project data *****/
+ /* Start data form */
+ Act_FormStart (ItsANewProject ? ActNewPrj :
+ ActChgPrj);
+ Prj_PutParams ();
+
/* Start box and table */
Box_StartBoxTable (NULL,Txt_Data,NULL,
NULL,Box_NOT_CLOSABLE,2);
@@ -2304,10 +2316,10 @@ static void Prj_PutFormProject (struct Project *Prj,bool ItsANewProject)
else
Box_EndBoxTableWithButton (Btn_CONFIRM_BUTTON,Txt_Save);
- /* End form */
+ /* End data form */
Act_FormEnd ();
- /***** End box *****/
+ /***** End project box *****/
Box_EndBox ();
}
diff --git a/swad_text.c b/swad_text.c
index 7e9f9724c..aaebcaee0 100644
--- a/swad_text.c
+++ b/swad_text.c
@@ -30999,6 +30999,89 @@ const char *Txt_Project_X_removed = // Warning: it is very important to include
"Projeto %s removido.";
#endif
+const char *Txt_PROJECT_ROLES_SINGUL_Abc[Prj_NUM_ROLES_IN_PROJECT] =
+ {
+#if L==1 // Prj_ROLE_UNK
+ "Desconegut/da"
+#elif L==2
+ "Unbekannter/e"
+#elif L==3
+ "Unknown"
+#elif L==4
+ "Desconocido/a"
+#elif L==5
+ "Inconnu/e"
+#elif L==6
+ "Desconocido/a" // Okoteve traducción
+#elif L==7
+ "Sconosciuto/a"
+#elif L==8
+ "Nieznany"
+#elif L==9
+ "Desconhecido/a"
+#endif
+ ,
+#if L==1 // Prj_ROLE_STD
+ "Estudiant"
+#elif L==2
+ "Student"
+#elif L==3
+ "Student"
+#elif L==4
+ "Estudiante"
+#elif L==5
+ "Étudiant/e"
+#elif L==6
+ "Temimbo'e"
+#elif L==7
+ "Studente"
+#elif L==8
+ "Student"
+#elif L==9
+ "Estudante"
+#endif
+ ,
+#if L==1 // Prj_ROLE_TUT
+ "Tutor"
+#elif L==2
+ "Tutor"
+#elif L==3
+ "Tutor"
+#elif L==4
+ "Tutor"
+#elif L==5
+ "Tuteur"
+#elif L==6
+ "Tutor" // Okoteve traducción
+#elif L==7
+ "Precettore"
+#elif L==8
+ "Nauczyciel"
+#elif L==9
+ "Tutor"
+#endif
+ ,
+#if L==1 // Prj_ROLE_EVA
+ "Avaluador"
+#elif L==2
+ "Auswerter"
+#elif L==3
+ "Evaluator"
+#elif L==4
+ "Evaluador"
+#elif L==5
+ "Évaluateur"
+#elif L==6
+ "Evaluador" // Okoteve traducción
+#elif L==7
+ "Valutatore"
+#elif L==8
+ "Ewaluator"
+#elif L==9
+ "Avaliador"
+#endif
+ };
+
const char *Txt_PROJECT_ROLES_SINGUL_abc[Prj_NUM_ROLES_IN_PROJECT] =
{
#if L==1 // Prj_ROLE_UNK