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')
*/
#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/

View File

@ -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 ();

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] =
{
[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++)
{

View File

@ -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,

View File

@ -14206,7 +14206,7 @@ const char *Txt_FORUM_WHICH_FORUM[For_NUM_FORUM_SETS] =
#elif L==9 // pt
"F&oacute;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&oacute;runs"
#elif L==10 // tr
"All my forums" // Çeviri lazim!
"T&uuml;m forumlar&inodot;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&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
,
[Usr_WHO_SELECTED] =
@ -57295,7 +57318,7 @@ const char *Txt_WHO[Usr_NUM_WHO] =
#elif L==5 // fr
"Utilisateurs s&eacute;lectionn&eacute;s"
#elif L==6 // gn
"Usuarios seleccionados" // Okoteve traducción
"Umi puruh&aacute;ra ojeporav&oacute;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&aacute;rios selecionados"
#elif L==10 // tr
"Selected users" // Çeviri lazim!
"Se&ccedil;ilen kullan&inodot;c&inodot;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&eacute;ra che aseg&iacute;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&aacute;rios que estou seguindo"
#elif L==10 // tr
"Users I'm following" // Çeviri lazim!
"Takip etti&gbreve;im kullan&inodot;c&inodot;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&aacute;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&aacute;rios"
#elif L==10 // tr
"All users" // Çeviri lazim!
"T&uuml;m kullan&inodot;c&inodot;lar"
#endif
};

View File

@ -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:

View File

@ -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,