diff --git a/swad_changelog.h b/swad_changelog.h index 78abb3a1e..04424dee3 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -633,10 +633,11 @@ Me sale este error, no s "can npt create received message (duplicated entry '243218-2160773' for key 'UsrCod_MsgCod') */ -#define Log_PLATFORM_VERSION "SWAD 23.87.4 (2024-07-17)" +#define Log_PLATFORM_VERSION "SWAD 23.87.5 (2024-07-23)" #define CSS_FILE "swad23.67.2.css" #define JS_FILE "swad23.79.js" /* + Version 23.87.5: Jul 23, 2024 Fixed bug in list of projects. (335272 lines) Version 23.87.4: Jul 17, 2024 Changes in some icons. (335196 lines) Copy the following icons to icon public directory: sudo cp icon/chalkboard-user.svg /var/www/html/swad/icon/ diff --git a/swad_forum.c b/swad_forum.c index e80f8b906..c80828964 100644 --- a/swad_forum.c +++ b/swad_forum.c @@ -1450,8 +1450,9 @@ static void For_PutFormWhichForums (const struct For_Forums *Forums) HTM_LI_Begin (NULL); HTM_LABEL_Begin (NULL); HTM_INPUT_RADIO ("ForumSet", - ((ForumSet == Forums->ForumSet) ? HTM_NO_ATTR : - HTM_CHECKED) | HTM_SUBMIT_ON_CLICK, + ((ForumSet == Forums->ForumSet) ? HTM_CHECKED : + HTM_NO_ATTR) | + HTM_SUBMIT_ON_CLICK, "value=\"%u\"",(unsigned) ForumSet); HTM_Txt (Txt_FORUM_WHICH_FORUM[ForumSet]); HTM_LABEL_End (); diff --git a/swad_project.c b/swad_project.c index b1dcb38dc..b12e7350d 100644 --- a/swad_project.c +++ b/swad_project.c @@ -90,7 +90,7 @@ static const Prj_RoleInProject_t Prj_RolesToShow[Prj_NUM_ROLES_TO_SHOW] = }; static const char *RoleIcon[Prj_NUM_ROLES_IN_PROJECT] = { - [Prj_ROLE_UNK] = "user-slash.svg", + [Prj_ROLE_UNK] = NULL, [Prj_ROLE_STD] = "person.svg", [Prj_ROLE_TUT] = "people-pulling.svg", [Prj_ROLE_EVL] = "people-line.svg", // "people-group.svg" @@ -455,6 +455,7 @@ void Prj_ShowProjects (struct Prj_Projects *Projects) { switch (Projects->Filter.Who) { + case Usr_WHO_NONE: case Usr_WHO_ME: case Usr_WHO_ALL: /* Show my projects / all projects */ @@ -682,7 +683,8 @@ static void Prj_ShowFormToFilterByUsrs (const struct Prj_Projects *Projects) { struct Prj_Filter Filter; Usr_Who_t Who; - unsigned Mask = 1 << Usr_WHO_ME | + unsigned Mask = 1 << Usr_WHO_NONE | + 1 << Usr_WHO_ME | 1 << Usr_WHO_SELECTED | 1 << Usr_WHO_ALL; @@ -723,7 +725,7 @@ static void Prj_ShowFormToFilterByRoleInPrj (const struct Prj_Projects *Projects struct Prj_Filter Filter; Prj_RoleInProject_t RoleInPrj; - for (RoleInPrj = (Prj_RoleInProject_t) 0; + for (RoleInPrj = (Prj_RoleInProject_t) 1; RoleInPrj <= (Prj_RoleInProject_t) (Prj_NUM_ROLES_IN_PROJECT - 1); RoleInPrj++) { diff --git a/swad_project_database.c b/swad_project_database.c index 9a23bf93e..1af905fbf 100644 --- a/swad_project_database.c +++ b/swad_project_database.c @@ -239,24 +239,16 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res, const char *UsrsSubQuery) // NULL if no users { /* Role in project subquery */ - static const char *RolPrjSubQuery[16] = // EVL TUT STD UNK - { // 3 2 1 0 - [0b0000] = "", // · · · · - [0b0001] = " AND (" "prj_users.RoleInProject IS NULL)", // · · · 1 - [0b0010] = " AND (prj_users.RoleInProject IN " "(1)" ")", // · · 1 · - [0b0011] = " AND (prj_users.RoleInProject IN " "(1)" " OR prj_users.RoleInProject IS NULL)", // · · 1 1 - [0b0100] = " AND (prj_users.RoleInProject IN " "(2)" ")", // · 1 · · - [0b0101] = " AND (prj_users.RoleInProject IN " "(2)" " OR prj_users.RoleInProject IS NULL)", // · 1 · 1 - [0b0110] = " AND (prj_users.RoleInProject IN " "(1,2)" ")", // · 1 1 · - [0b0111] = " AND (prj_users.RoleInProject IN " "(1,2)" " OR prj_users.RoleInProject IS NULL)", // · 1 1 1 - [0b1000] = " AND (prj_users.RoleInProject IN " "(3)" ")", // 1 · · · - [0b1001] = " AND (prj_users.RoleInProject IN " "(3)" " OR prj_users.RoleInProject IS NULL)", // 1 · · 1 - [0b1010] = " AND (prj_users.RoleInProject IN " "(1,""3)" ")", // 1 · 1 · - [0b1011] = " AND (prj_users.RoleInProject IN " "(1,""3)" " OR prj_users.RoleInProject IS NULL)", // 1 · 1 1 - [0b1100] = " AND (prj_users.RoleInProject IN " "(2,3)" ")", // 1 1 · · - [0b1101] = " AND (prj_users.RoleInProject IN " "(2,3)" " OR prj_users.RoleInProject IS NULL)", // 1 1 · 1 - [0b1110] = " AND (prj_users.RoleInProject IN " "(1,2,3)" ")", // 1 1 1 · - [0b1111] = "", // 1 1 1 1 + static const char *RolPrjSubQuery[16] = // EVL TUT STD UNK + { // 3 2 1 0 + [0b0000] = "", // · · · · + [0b0010] = " AND (prj_users.RoleInProject IN " "(1)" ")", // · · 1 · + [0b0100] = " AND (prj_users.RoleInProject IN " "(2)" ")", // · 1 · · + [0b0110] = " AND (prj_users.RoleInProject IN " "(1,2)" ")", // · 1 1 · + [0b1000] = " AND (prj_users.RoleInProject IN " "(3)" ")", // 1 · · · + [0b1010] = " AND (prj_users.RoleInProject IN " "(1,""3)" ")", // 1 · 1 · + [0b1100] = " AND (prj_users.RoleInProject IN " "(2,3)" ")", // 1 1 · · + [0b1110] = " AND (prj_users.RoleInProject IN " "(1,2,3)" ")", // 1 1 1 · }; char *AssignSubQuery; char *HidVisSubQuery; @@ -389,8 +381,62 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res, /* Query */ switch (Projects->Filter.Who) { - case Usr_WHO_ME: - /* Get list of projects */ + case Usr_WHO_NONE: + /* Get list of projects without users */ + switch (Projects->SelectedOrder) + { + case Prj_ORDER_START_TIME: + case Prj_ORDER_END_TIME: + case Prj_ORDER_TITLE: + NumPrjsFromDB = (unsigned) + DB_QuerySELECT (mysql_res,"can not get projects", + "SELECT prj_projects.PrjCod" + " FROM prj_projects" + " WHERE prj_projects.CrsCod=%ld" + "%s" + "%s" + "%s" + "%s" + " AND prj_projects.PrjCod NOT IN (SELECT PrjCod FROM prj_users)" + " GROUP BY prj_projects.PrjCod" // To not repeat projects (DISTINCT can not be used) + " ORDER BY %s", + Gbl.Hierarchy.Node[Hie_CRS].HieCod, + AssignSubQuery, + HidVisSubQuery, + ReviewSubQuery, + DptCodSubQuery, + OrderBySubQuery[Projects->SelectedOrder]); + break; + case Prj_ORDER_DEPARTMENT: + NumPrjsFromDB = (unsigned) + DB_QuerySELECT (mysql_res,"can not get projects", + "SELECT prj_projects.PrjCod" + " FROM prj_projects LEFT JOIN dpt_departments" + " ON prj_projects.DptCod=dpt_departments.DptCod" + " LEFT JOIN prj_users" + " ON prj_projects.PrjCod=prj_users.PrjCod" + " WHERE prj_projects.CrsCod=%ld" + "%s" + "%s" + "%s" + "%s" + " AND prj_projects.PrjCod=prj_users.PrjCod" + " AND prj_users.UsrCod=%ld" + "%s" + " GROUP BY prj_projects.PrjCod" // To not repeat projects (DISTINCT can not be used) + " ORDER BY %s", + Gbl.Hierarchy.Node[Hie_CRS].HieCod, + AssignSubQuery, + HidVisSubQuery, + ReviewSubQuery, + DptCodSubQuery, + Gbl.Usrs.Me.UsrDat.UsrCod, + RolPrjSubQuery[Projects->Filter.RolPrj], + OrderBySubQuery[Projects->SelectedOrder]); + break; + } + break; + case Usr_WHO_ME: /* Get list of my projects */ switch (Projects->SelectedOrder) { case Prj_ORDER_START_TIME: @@ -449,10 +495,9 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res, break; } break; - case Usr_WHO_SELECTED: + case Usr_WHO_SELECTED: /* Get list of projects associated to selected users */ if (UsrsSubQuery) { - /* Get list of projects */ switch (Projects->SelectedOrder) { case Prj_ORDER_START_TIME: @@ -512,8 +557,7 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res, } } break; - case Usr_WHO_ALL: - /* Get list of projects */ + case Usr_WHO_ALL: /* Get list of projects associated to any user */ switch (Projects->SelectedOrder) { case Prj_ORDER_START_TIME: @@ -530,6 +574,7 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res, "%s" "%s" "%s" + " GROUP BY prj_projects.PrjCod" // To not repeat projects (DISTINCT can not be used) " ORDER BY %s", Gbl.Hierarchy.Node[Hie_CRS].HieCod, AssignSubQuery, @@ -553,6 +598,7 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res, "%s" "%s" "%s" + " GROUP BY prj_projects.PrjCod" // To not repeat projects (DISTINCT can not be used) " ORDER BY %s", Gbl.Hierarchy.Node[Hie_CRS].HieCod, AssignSubQuery, diff --git a/swad_text.c b/swad_text.c index 6f08c897b..cfde42613 100644 --- a/swad_text.c +++ b/swad_text.c @@ -14206,7 +14206,7 @@ const char *Txt_FORUM_WHICH_FORUM[For_NUM_FORUM_SETS] = #elif L==9 // pt "Fóruns deste site" #elif L==10 // tr - "Forums of this location" // Çeviri lazim! + "Bu konumdaki forumlar" #endif , [For_ALL_MY_FORUMS] = @@ -14229,7 +14229,7 @@ const char *Txt_FORUM_WHICH_FORUM[For_NUM_FORUM_SETS] = #elif L==9 // pt "Todos os meus fóruns" #elif L==10 // tr - "All my forums" // Çeviri lazim! + "Tüm forumlarım" #endif }; @@ -57281,6 +57281,29 @@ const char *Txt_WHO[Usr_NUM_WHO] = "Eu" #elif L==10 // tr "Me" // Çeviri lazim! +#endif + , + [Usr_WHO_NONE] = +#if L==1 // ca + "Cap usuari" +#elif L==2 // de + "Kein Benutzer" +#elif L==3 // en + "No user" +#elif L==4 // es + "Ningún usuario" +#elif L==5 // fr + "Aucun utilisateur" +#elif L==6 // gn + "Ndaipóri puruhára" +#elif L==7 // it + "Nessun utente" +#elif L==8 // pl + "Brak użytkownika" +#elif L==9 // pt + "Nenhum utilizador" +#elif L==10 // tr + "Kullanıcı yok" #endif , [Usr_WHO_SELECTED] = @@ -57295,7 +57318,7 @@ const char *Txt_WHO[Usr_NUM_WHO] = #elif L==5 // fr "Utilisateurs sélectionnés" #elif L==6 // gn - "Usuarios seleccionados" // Okoteve traducción + "Umi puruhára ojeporavóva" #elif L==7 // it "Utenti selezionati" #elif L==8 // pl @@ -57303,7 +57326,7 @@ const char *Txt_WHO[Usr_NUM_WHO] = #elif L==9 // pt "Usuários selecionados" #elif L==10 // tr - "Selected users" // Çeviri lazim! + "Seçilen kullanıcılar" #endif , [Usr_WHO_FOLLOWED] = @@ -57318,7 +57341,7 @@ const char *Txt_WHO[Usr_NUM_WHO] = #elif L==5 // fr "Utilisateurs qui je suis" #elif L==6 // gn - "Usuarios que sigo" // Okoteve traducción + "Usuario-kuéra che asegíva" #elif L==7 // it "Utenti che sto seguenti" #elif L==8 // pl @@ -57326,7 +57349,7 @@ const char *Txt_WHO[Usr_NUM_WHO] = #elif L==9 // pt "Usuários que estou seguindo" #elif L==10 // tr - "Users I'm following" // Çeviri lazim! + "Takip ettiğim kullanıcılar" #endif , [Usr_WHO_ALL] = @@ -57341,7 +57364,7 @@ const char *Txt_WHO[Usr_NUM_WHO] = #elif L==5 // fr "Tous les utilisateurs" #elif L==6 // gn - "Todos los usuarios" // Okoteve traducción + "Mayma puruhára" #elif L==7 // it "Tutti gli utenti" #elif L==8 // pl @@ -57349,7 +57372,7 @@ const char *Txt_WHO[Usr_NUM_WHO] = #elif L==9 // pt "Todos os usuários" #elif L==10 // tr - "All users" // Çeviri lazim! + "Tüm kullanıcılar" #endif }; diff --git a/swad_user.c b/swad_user.c index 6818675cc..4487a1a24 100644 --- a/swad_user.c +++ b/swad_user.c @@ -6469,6 +6469,7 @@ void Usr_PutWhoIcon (Usr_Who_t Who) static const char *Icon[Usr_NUM_WHO] = { [Usr_WHO_UNKNOWN ] = NULL, + [Usr_WHO_NONE ] = "user-slash.svg", [Usr_WHO_ME ] = NULL, [Usr_WHO_SELECTED] = "search.svg", [Usr_WHO_FOLLOWED] = "user-check.svg", @@ -6487,6 +6488,7 @@ void Usr_PutWhoIcon (Usr_Who_t Who) Txt_WHO[Who], "class=\"ICO_HIGHLIGHT PHOTOR15x20\""); break; + case Usr_WHO_NONE: case Usr_WHO_SELECTED: case Usr_WHO_FOLLOWED: case Usr_WHO_ALL: diff --git a/swad_user_type.h b/swad_user_type.h index 488344837..6a1830d98 100644 --- a/swad_user_type.h +++ b/swad_user_type.h @@ -131,10 +131,11 @@ typedef enum Usr_OTHER, } Usr_MeOrOther_t; -#define Usr_NUM_WHO 5 +#define Usr_NUM_WHO 6 typedef enum { Usr_WHO_UNKNOWN, + Usr_WHO_NONE, Usr_WHO_ME, Usr_WHO_SELECTED, Usr_WHO_FOLLOWED,