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