Version 23.87.5: Jul 23, 2024 Fixed bug in list of projects.

This commit is contained in:
acanas 2024-08-28 18:17:05 +02:00
parent 798b522943
commit 94865b2942
7 changed files with 115 additions and 39 deletions

View File

@ -633,10 +633,11 @@ Me sale este error, no s
"can npt create received message (duplicated entry '243218-2160773' for key 'UsrCod_MsgCod') "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 CSS_FILE "swad23.67.2.css"
#define JS_FILE "swad23.79.js" #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) Version 23.87.4: Jul 17, 2024 Changes in some icons. (335196 lines)
Copy the following icons to icon public directory: Copy the following icons to icon public directory:
sudo cp icon/chalkboard-user.svg /var/www/html/swad/icon/ sudo cp icon/chalkboard-user.svg /var/www/html/swad/icon/

View File

@ -1450,8 +1450,9 @@ static void For_PutFormWhichForums (const struct For_Forums *Forums)
HTM_LI_Begin (NULL); HTM_LI_Begin (NULL);
HTM_LABEL_Begin (NULL); HTM_LABEL_Begin (NULL);
HTM_INPUT_RADIO ("ForumSet", HTM_INPUT_RADIO ("ForumSet",
((ForumSet == Forums->ForumSet) ? HTM_NO_ATTR : ((ForumSet == Forums->ForumSet) ? HTM_CHECKED :
HTM_CHECKED) | HTM_SUBMIT_ON_CLICK, HTM_NO_ATTR) |
HTM_SUBMIT_ON_CLICK,
"value=\"%u\"",(unsigned) ForumSet); "value=\"%u\"",(unsigned) ForumSet);
HTM_Txt (Txt_FORUM_WHICH_FORUM[ForumSet]); HTM_Txt (Txt_FORUM_WHICH_FORUM[ForumSet]);
HTM_LABEL_End (); HTM_LABEL_End ();

View File

@ -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] = 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_STD] = "person.svg",
[Prj_ROLE_TUT] = "people-pulling.svg", [Prj_ROLE_TUT] = "people-pulling.svg",
[Prj_ROLE_EVL] = "people-line.svg", // "people-group.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) switch (Projects->Filter.Who)
{ {
case Usr_WHO_NONE:
case Usr_WHO_ME: case Usr_WHO_ME:
case Usr_WHO_ALL: case Usr_WHO_ALL:
/* Show my projects / all projects */ /* Show my projects / all projects */
@ -682,7 +683,8 @@ static void Prj_ShowFormToFilterByUsrs (const struct Prj_Projects *Projects)
{ {
struct Prj_Filter Filter; struct Prj_Filter Filter;
Usr_Who_t Who; 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_SELECTED |
1 << Usr_WHO_ALL; 1 << Usr_WHO_ALL;
@ -723,7 +725,7 @@ static void Prj_ShowFormToFilterByRoleInPrj (const struct Prj_Projects *Projects
struct Prj_Filter Filter; struct Prj_Filter Filter;
Prj_RoleInProject_t RoleInPrj; 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 <= (Prj_RoleInProject_t) (Prj_NUM_ROLES_IN_PROJECT - 1);
RoleInPrj++) RoleInPrj++)
{ {

View File

@ -242,21 +242,13 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res,
static const char *RolPrjSubQuery[16] = // EVL TUT STD UNK static const char *RolPrjSubQuery[16] = // EVL TUT STD UNK
{ // 3 2 1 0 { // 3 2 1 0
[0b0000] = "", // · · · · [0b0000] = "", // · · · ·
[0b0001] = " AND (" "prj_users.RoleInProject IS NULL)", // · · · 1
[0b0010] = " AND (prj_users.RoleInProject IN " "(1)" ")", // · · 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 · · [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 · [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 · · · [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 · [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 · · [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 · [0b1110] = " AND (prj_users.RoleInProject IN " "(1,2,3)" ")", // 1 1 1 ·
[0b1111] = "", // 1 1 1 1
}; };
char *AssignSubQuery; char *AssignSubQuery;
char *HidVisSubQuery; char *HidVisSubQuery;
@ -389,8 +381,62 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res,
/* Query */ /* Query */
switch (Projects->Filter.Who) switch (Projects->Filter.Who)
{ {
case Usr_WHO_ME: case Usr_WHO_NONE:
/* Get list of projects */ /* 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) switch (Projects->SelectedOrder)
{ {
case Prj_ORDER_START_TIME: case Prj_ORDER_START_TIME:
@ -449,10 +495,9 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res,
break; break;
} }
break; break;
case Usr_WHO_SELECTED: case Usr_WHO_SELECTED: /* Get list of projects associated to selected users */
if (UsrsSubQuery) if (UsrsSubQuery)
{ {
/* Get list of projects */
switch (Projects->SelectedOrder) switch (Projects->SelectedOrder)
{ {
case Prj_ORDER_START_TIME: case Prj_ORDER_START_TIME:
@ -512,8 +557,7 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res,
} }
} }
break; break;
case Usr_WHO_ALL: case Usr_WHO_ALL: /* Get list of projects associated to any user */
/* Get list of projects */
switch (Projects->SelectedOrder) switch (Projects->SelectedOrder)
{ {
case Prj_ORDER_START_TIME: case Prj_ORDER_START_TIME:
@ -530,6 +574,7 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res,
"%s" "%s"
"%s" "%s"
"%s" "%s"
" GROUP BY prj_projects.PrjCod" // To not repeat projects (DISTINCT can not be used)
" ORDER BY %s", " ORDER BY %s",
Gbl.Hierarchy.Node[Hie_CRS].HieCod, Gbl.Hierarchy.Node[Hie_CRS].HieCod,
AssignSubQuery, AssignSubQuery,
@ -553,6 +598,7 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res,
"%s" "%s"
"%s" "%s"
"%s" "%s"
" GROUP BY prj_projects.PrjCod" // To not repeat projects (DISTINCT can not be used)
" ORDER BY %s", " ORDER BY %s",
Gbl.Hierarchy.Node[Hie_CRS].HieCod, Gbl.Hierarchy.Node[Hie_CRS].HieCod,
AssignSubQuery, AssignSubQuery,

View File

@ -14206,7 +14206,7 @@ const char *Txt_FORUM_WHICH_FORUM[For_NUM_FORUM_SETS] =
#elif L==9 // pt #elif L==9 // pt
"F&oacute;runs deste site" "F&oacute;runs deste site"
#elif L==10 // tr #elif L==10 // tr
"Forums of this location" // Çeviri lazim! "Bu konumdaki forumlar"
#endif #endif
, ,
[For_ALL_MY_FORUMS] = [For_ALL_MY_FORUMS] =
@ -14229,7 +14229,7 @@ const char *Txt_FORUM_WHICH_FORUM[For_NUM_FORUM_SETS] =
#elif L==9 // pt #elif L==9 // pt
"Todos os meus f&oacute;runs" "Todos os meus f&oacute;runs"
#elif L==10 // tr #elif L==10 // tr
"All my forums" // Çeviri lazim! "T&uuml;m forumlar&inodot;m"
#endif #endif
}; };
@ -57281,6 +57281,29 @@ const char *Txt_WHO[Usr_NUM_WHO] =
"Eu" "Eu"
#elif L==10 // tr #elif L==10 // tr
"Me" // Çeviri lazim! "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&uacute;n usuario"
#elif L==5 // fr
"Aucun utilisateur"
#elif L==6 // gn
"Ndaip&oacute;ri puruh&aacute;ra"
#elif L==7 // it
"Nessun utente"
#elif L==8 // pl
"Brak u&zdot;ytkownika"
#elif L==9 // pt
"Nenhum utilizador"
#elif L==10 // tr
"Kullan&inodot;c&inodot; yok"
#endif #endif
, ,
[Usr_WHO_SELECTED] = [Usr_WHO_SELECTED] =
@ -57295,7 +57318,7 @@ const char *Txt_WHO[Usr_NUM_WHO] =
#elif L==5 // fr #elif L==5 // fr
"Utilisateurs s&eacute;lectionn&eacute;s" "Utilisateurs s&eacute;lectionn&eacute;s"
#elif L==6 // gn #elif L==6 // gn
"Usuarios seleccionados" // Okoteve traducción "Umi puruh&aacute;ra ojeporav&oacute;va"
#elif L==7 // it #elif L==7 // it
"Utenti selezionati" "Utenti selezionati"
#elif L==8 // pl #elif L==8 // pl
@ -57303,7 +57326,7 @@ const char *Txt_WHO[Usr_NUM_WHO] =
#elif L==9 // pt #elif L==9 // pt
"Usu&aacute;rios selecionados" "Usu&aacute;rios selecionados"
#elif L==10 // tr #elif L==10 // tr
"Selected users" // Çeviri lazim! "Se&ccedil;ilen kullan&inodot;c&inodot;lar"
#endif #endif
, ,
[Usr_WHO_FOLLOWED] = [Usr_WHO_FOLLOWED] =
@ -57318,7 +57341,7 @@ const char *Txt_WHO[Usr_NUM_WHO] =
#elif L==5 // fr #elif L==5 // fr
"Utilisateurs qui je suis" "Utilisateurs qui je suis"
#elif L==6 // gn #elif L==6 // gn
"Usuarios que sigo" // Okoteve traducción "Usuario-ku&eacute;ra che aseg&iacute;va"
#elif L==7 // it #elif L==7 // it
"Utenti che sto seguenti" "Utenti che sto seguenti"
#elif L==8 // pl #elif L==8 // pl
@ -57326,7 +57349,7 @@ const char *Txt_WHO[Usr_NUM_WHO] =
#elif L==9 // pt #elif L==9 // pt
"Usu&aacute;rios que estou seguindo" "Usu&aacute;rios que estou seguindo"
#elif L==10 // tr #elif L==10 // tr
"Users I'm following" // Çeviri lazim! "Takip etti&gbreve;im kullan&inodot;c&inodot;lar"
#endif #endif
, ,
[Usr_WHO_ALL] = [Usr_WHO_ALL] =
@ -57341,7 +57364,7 @@ const char *Txt_WHO[Usr_NUM_WHO] =
#elif L==5 // fr #elif L==5 // fr
"Tous les utilisateurs" "Tous les utilisateurs"
#elif L==6 // gn #elif L==6 // gn
"Todos los usuarios" // Okoteve traducción "Mayma puruh&aacute;ra"
#elif L==7 // it #elif L==7 // it
"Tutti gli utenti" "Tutti gli utenti"
#elif L==8 // pl #elif L==8 // pl
@ -57349,7 +57372,7 @@ const char *Txt_WHO[Usr_NUM_WHO] =
#elif L==9 // pt #elif L==9 // pt
"Todos os usu&aacute;rios" "Todos os usu&aacute;rios"
#elif L==10 // tr #elif L==10 // tr
"All users" // Çeviri lazim! "T&uuml;m kullan&inodot;c&inodot;lar"
#endif #endif
}; };

View File

@ -6469,6 +6469,7 @@ void Usr_PutWhoIcon (Usr_Who_t Who)
static const char *Icon[Usr_NUM_WHO] = static const char *Icon[Usr_NUM_WHO] =
{ {
[Usr_WHO_UNKNOWN ] = NULL, [Usr_WHO_UNKNOWN ] = NULL,
[Usr_WHO_NONE ] = "user-slash.svg",
[Usr_WHO_ME ] = NULL, [Usr_WHO_ME ] = NULL,
[Usr_WHO_SELECTED] = "search.svg", [Usr_WHO_SELECTED] = "search.svg",
[Usr_WHO_FOLLOWED] = "user-check.svg", [Usr_WHO_FOLLOWED] = "user-check.svg",
@ -6487,6 +6488,7 @@ void Usr_PutWhoIcon (Usr_Who_t Who)
Txt_WHO[Who], Txt_WHO[Who],
"class=\"ICO_HIGHLIGHT PHOTOR15x20\""); "class=\"ICO_HIGHLIGHT PHOTOR15x20\"");
break; break;
case Usr_WHO_NONE:
case Usr_WHO_SELECTED: case Usr_WHO_SELECTED:
case Usr_WHO_FOLLOWED: case Usr_WHO_FOLLOWED:
case Usr_WHO_ALL: case Usr_WHO_ALL:

View File

@ -131,10 +131,11 @@ typedef enum
Usr_OTHER, Usr_OTHER,
} Usr_MeOrOther_t; } Usr_MeOrOther_t;
#define Usr_NUM_WHO 5 #define Usr_NUM_WHO 6
typedef enum typedef enum
{ {
Usr_WHO_UNKNOWN, Usr_WHO_UNKNOWN,
Usr_WHO_NONE,
Usr_WHO_ME, Usr_WHO_ME,
Usr_WHO_SELECTED, Usr_WHO_SELECTED,
Usr_WHO_FOLLOWED, Usr_WHO_FOLLOWED,