Version 21.81.2: Jan 02, 2022 Functions moved from swad_figure to other modules.

This commit is contained in:
acanas 2022-01-02 23:44:27 +01:00
parent 84f367b274
commit e88fbae138
11 changed files with 1052 additions and 982 deletions

View File

@ -2320,8 +2320,23 @@ table.CELLS_PAD_10 > tbody > tr > td {padding:10px;}
}
/************************** Listing of users *********************************/
.USR_LIST_NUM {color:#A0A0A0; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_N {color:#202020; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM {color:#a0a0a0; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_WHITE {color:#a0a0a0; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_GREY {color:#a0a0a0; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_PURPLE {color:#a0a0a0; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_BLUE {color:#a0a0a0; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_YELLOW {color:#a0a0a0; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_PINK {color:#a0a0a0; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_DARK {color:#808080; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_N {color:#202020; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_N_WHITE {color:#202020; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_N_GREY {color:#202020; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_N_PURPLE {color:#202020; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_N_BLUE {color:#202020; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_N_YELLOW {color:#202020; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_N_PINK {color:#202020; font-size:15pt; font-weight:bold;}
.USR_LIST_NUM_N_DARK {color:#e0e0e0; font-size:15pt; font-weight:bold;}
/*****************************************************************************/
.TITLE_WHITE {color:#505050; font-size:18pt;}
@ -2364,7 +2379,7 @@ table.CELLS_PAD_10 > tbody > tr > td {padding:10px;}
.FORM_IN_BLUE {color:#4d88a1; font-size:13pt;}
.FORM_IN_YELLOW {color:#7c4d2a; font-size:13pt;}
.FORM_IN_PINK {color:#4d88a1; font-size:13pt;}
.FORM_IN_DARK {color:#a6c4d0; font-size:13pt;}
.FORM_IN_DARK {color:#afc4cc; font-size:13pt;}
/* Outside white box */
.FORM_OUT_WHITE {color:#4d88a1; font-size:13pt;}
@ -2551,6 +2566,43 @@ table.CELLS_PAD_10 > tbody > tr > td {padding:10px;}
.DAT_LIGHT_PINK {color:#a0a0a0; font-size:13pt;}
.DAT_LIGHT_DARK {color:#909090; font-size:13pt;}
.DAT_SMALL {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt;}
.DAT_SMALL_WHITE {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt;}
.DAT_SMALL_GREY {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt;}
.DAT_SMALL_PURPLE {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt;}
.DAT_SMALL_BLUE {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt;}
.DAT_SMALL_YELLOW {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt;}
.DAT_SMALL_PINK {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt;}
.DAT_SMALL_DARK {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#d0d0d0; font-size:12pt;}
.DAT_SMALL_N {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt;}
.DAT_SMALL_N_WHITE {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt;}
.DAT_SMALL_N_GREY {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt;}
.DAT_SMALL_N_PURPLE {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt;}
.DAT_SMALL_N_BLUE {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt;}
.DAT_SMALL_N_YELLOW {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt;}
.DAT_SMALL_N_PINK {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt;}
.DAT_SMALL_N_DARK {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:white; font-size:12pt;}
.DAT_SMALL_NOBR {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR_WHITE {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR_GREY {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR_PURPLE {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR_BLUE {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR_YELLOW {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR_PINK {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR_DARK {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#d0d0d0; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR_N {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR_N_WHITE {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR_N_GREY {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR_N_PURPLE {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR_N_BLUE {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR_N_YELLOW {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR_N_PINK {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_NOBR_N_DARK {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:white; font-size:12pt; white-space:nowrap;}
.DAT_GREEN {color:#246600; font-size:13pt;}
.DAT_RED {color:#660000; font-size:13pt;}
@ -2579,11 +2631,7 @@ table.CELLS_PAD_10 > tbody > tr > td {padding:10px;}
border-width:1px;
}
.DAT_SMALL {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt;}
.DAT_SMALL_LIGHT {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#A0A0A0; font-size:12pt;}
.DAT_SMALL_NOBR {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#404040; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_N {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt;}
.DAT_SMALL_NOBR_N {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:black; font-size:12pt; white-space:nowrap;}
.DAT_SMALL_GREY {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#707070; font-size:12pt;}
.DAT_SMALL_RED {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#660000; font-size:12pt;}
@ -2749,7 +2797,7 @@ table.CELLS_PAD_10 > tbody > tr > td {padding:10px;}
.TIT_TBL_BLUE {color:#4d88a1;}
.TIT_TBL_YELLOW {color:#4d88a1;}
.TIT_TBL_PINK {color:#4d88a1;}
.TIT_TBL_DARK {color:#8cbcce;}
.TIT_TBL_DARK {color:#afc4cc;}
.GRP_TITLE {color:#4d88a1; font-size:15pt; font-weight:bold;}

View File

@ -602,10 +602,11 @@ TODO: FIX BUG, URGENT! En las fechas como par
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
*/
#define Log_PLATFORM_VERSION "SWAD 21.81.1 (2022-01-02)"
#define Log_PLATFORM_VERSION "SWAD 21.81.2 (2022-01-02)"
#define CSS_FILE "swad21.81.css"
#define JS_FILE "swad21.78.2.js"
/*
Version 21.81.2: Jan 02, 2022 Functions moved from swad_figure to other modules. (322523 lines)
Version 21.81.1: Jan 02, 2022 Fixed bug in projects. (322460 lines)
Version 21.81: Jan 02, 2022 Code refactoring on table heads. (322457 lines)
Version 21.80: Jan 01, 2022 Working on design of dark theme. (322456 lines)

View File

@ -112,41 +112,8 @@ static void Fig_ReqShowFigure (Fig_FigureType_t SelectedFigureType);
static void Fig_PutHiddenParamFigureType (Fig_FigureType_t FigureType);
static void Fig_PutHiddenParamScopeFig (HieLvl_Level_t ScopeFig);
static void Hie_GetAndShowHierarchyStats (void);
static void Fig_WriteHeadHierarchy (void);
static void Fig_GetAndShowHierarchyWithInss (void);
static void Fig_GetAndShowHierarchyWithCtrs (void);
static void Fig_GetAndShowHierarchyWithDegs (void);
static void Fig_GetAndShowHierarchyWithCrss (void);
static void Fig_GetAndShowHierarchyWithUsrs (Rol_Role_t Role);
static void Fig_GetAndShowHierarchyTotal (void);
static void Fig_ShowHierarchyRow (const char *Text1,const char *Text2,
const char *ClassTxt,
int NumCtys, // < 0 ==> do not show number
int NumInss, // < 0 ==> do not show number
int NumCtrs, // < 0 ==> do not show number
int NumDegs, // < 0 ==> do not show number
int NumCrss); // < 0 ==> do not show number
static void Fig_ShowHierarchyCell (const char *ClassTxt,int Num);
static void Ins_GetAndShowInstitutionsStats (void);
static void Fig_GetAndShowInssOrderedByNumCtrs (void);
static void Fig_GetAndShowInssOrderedByNumDegs (void);
static void Fig_GetAndShowInssOrderedByNumCrss (void);
static void Fig_GetAndShowInssOrderedByNumUsrsInCrss (void);
static void Fig_GetAndShowInssOrderedByNumUsrsWhoClaimToBelongToThem (void);
static void Fig_ShowInss (MYSQL_RES **mysql_res,unsigned NumInss,
const char *TxtFigure);
static unsigned Fig_GetInsAndStat (struct Ins_Instit *Ins,MYSQL_RES *mysql_res);
static void DegTyp_GetAndShowDegreeTypesStats (void);
static void Usr_GetAndShowUsersStats (void);
static void Fig_GetAndShowNumUsrsInCrss (Rol_Role_t Role);
static void Fig_GetAndShowNumUsrsNotBelongingToAnyCrs (void);
static void Usr_GetAndShowUsersRanking (void);
static void Brw_GetAndShowFileBrowsersStats (void);
static void Fig_GetSizeOfFileZone (Brw_FileBrowser_t FileBrowser,
struct Fig_SizeOfFileZones *SizeOfFileZones);
@ -389,934 +356,6 @@ void Fig_ShowFigures (void)
Fig_Function[SelectedFigureType] ();
}
/*****************************************************************************/
/********************** Show stats about number of users *********************/
/*****************************************************************************/
static void Usr_GetAndShowUsersStats (void)
{
extern const char *Hlp_ANALYTICS_Figures_users;
extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES];
extern const char *Txt_Users;
extern const char *Txt_Number_of_users;
extern const char *Txt_Average_number_of_courses_to_which_a_user_belongs;
extern const char *Txt_Average_number_of_users_belonging_to_a_course;
/***** Begin box and table *****/
Box_BoxTableBegin (NULL,Txt_FIGURE_TYPES[Fig_USERS],
NULL,NULL,
Hlp_ANALYTICS_Figures_users,Box_NOT_CLOSABLE,2);
/***** Write heading *****/
HTM_TR_Begin (NULL);
HTM_TH (Txt_Users ,HTM_HEAD_RIGHT);
HTM_TH (Txt_Number_of_users ,HTM_HEAD_RIGHT);
HTM_TH (Txt_Average_number_of_courses_to_which_a_user_belongs,HTM_HEAD_RIGHT);
HTM_TH (Txt_Average_number_of_users_belonging_to_a_course ,HTM_HEAD_RIGHT);
HTM_TR_End ();
/***** Figures *****/
Fig_GetAndShowNumUsrsInCrss (Rol_STD); // Students
Fig_GetAndShowNumUsrsInCrss (Rol_NET); // Non-editing teachers
Fig_GetAndShowNumUsrsInCrss (Rol_TCH); // Teachers
Fig_GetAndShowNumUsrsInCrss (Rol_UNK); // Any user in courses
/***** Separator *****/
HTM_TR_Begin (NULL);
HTM_TH_Span (NULL,HTM_HEAD_CENTER,1,4,"SEPAR_ROW");
HTM_TR_End ();
Fig_GetAndShowNumUsrsNotBelongingToAnyCrs (); // Users not beloging to any course
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/**************** Get and show number of users in courses ********************/
/*****************************************************************************/
// Rol_UNK means any role in courses
static void Fig_GetAndShowNumUsrsInCrss (Rol_Role_t Role)
{
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *The_ClassDatStrong[The_NUM_THEMES];
extern const char *Txt_Total;
extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
long Cod = Sco_GetCurrentCod ();
char *Class;
unsigned Roles;
/***** Initializations depending on role *****/
if (Role == Rol_UNK)
{
if (asprintf (&Class,"RB %s LINE_TOP",The_ClassDatStrong[Gbl.Prefs.Theme]) < 0)
Err_NotEnoughMemoryExit ();
Roles = (1 << Rol_STD) |
(1 << Rol_NET) |
(1 << Rol_TCH);
}
else
{
if (asprintf (&Class,"RB %s",The_ClassDat[Gbl.Prefs.Theme]) < 0)
Err_NotEnoughMemoryExit ();
Roles = (1 << Role);
}
/***** Write the total number of users *****/
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Txt ((Role == Rol_UNK) ? Txt_Total :
Txt_ROLES_PLURAL_Abc[Role][Usr_SEX_UNKNOWN]);
HTM_TD_End ();
/* Number of users in courses */
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Unsigned (Enr_GetCachedNumUsrsInCrss (Gbl.Scope.Current,Cod,Roles));
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Double2Decimals (Enr_GetCachedAverageNumCrssPerUsr (Gbl.Scope.Current,Cod,Role));
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Double2Decimals (Enr_GetCachedAverageNumUsrsPerCrs (Gbl.Scope.Current,Cod,Role));
HTM_TD_End ();
HTM_TR_End ();
free (Class);
}
/*****************************************************************************/
/**************** Get and show number of users in courses ********************/
/*****************************************************************************/
static void Fig_GetAndShowNumUsrsNotBelongingToAnyCrs (void)
{
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
char *Class;
if (asprintf (&Class,"%s RB",The_ClassDat[Gbl.Prefs.Theme]) < 0)
Err_NotEnoughMemoryExit ();
/***** Write the total number of users not belonging to any course *****/
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Txt (Txt_ROLES_PLURAL_Abc[Rol_GST][Usr_SEX_UNKNOWN]);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Unsigned (Enr_GetCachedNumUsrsNotBelongingToAnyCrs ());
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Double2Decimals (0.0);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Double2Decimals (0.0);
HTM_TD_End ();
HTM_TR_End ();
free (Class);
}
/*****************************************************************************/
/****************************** Show users' ranking **************************/
/*****************************************************************************/
static void Usr_GetAndShowUsersRanking (void)
{
extern const char *Hlp_ANALYTICS_Figures_ranking;
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES];
extern const char *Txt_Clicks;
extern const char *Txt_Clicks_per_day;
extern const char *Txt_Timeline;
extern const char *Txt_Downloads;
extern const char *Txt_Forums;
extern const char *Txt_Messages;
extern const char *Txt_Followers;
/***** Begin box and table *****/
Box_BoxTableBegin (NULL,Txt_FIGURE_TYPES[Fig_USERS_RANKING],
NULL,NULL,
Hlp_ANALYTICS_Figures_ranking,Box_NOT_CLOSABLE,2);
/***** Write heading *****/
HTM_TR_Begin (NULL);
HTM_TH (Txt_Clicks ,HTM_HEAD_CENTER);
HTM_TH (Txt_Clicks_per_day,HTM_HEAD_CENTER);
HTM_TH (Txt_Timeline ,HTM_HEAD_CENTER);
HTM_TH (Txt_Followers ,HTM_HEAD_CENTER);
HTM_TH (Txt_Downloads ,HTM_HEAD_CENTER);
HTM_TH (Txt_Forums ,HTM_HEAD_CENTER);
HTM_TH (Txt_Messages ,HTM_HEAD_CENTER);
HTM_TR_End ();
/***** Rankings *****/
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"%s LT\"",The_ClassDat[Gbl.Prefs.Theme]);
Prf_GetAndShowRankingClicks ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LT\"",The_ClassDat[Gbl.Prefs.Theme]);
Prf_GetAndShowRankingClicksPerDay ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LT\"",The_ClassDat[Gbl.Prefs.Theme]);
Prf_GetAndShowRankingTimelinePubs ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LT\"",The_ClassDat[Gbl.Prefs.Theme]);
Fol_GetAndShowRankingFollowers ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LT\"",The_ClassDat[Gbl.Prefs.Theme]);
Prf_GetAndShowRankingFileViews ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LT\"",The_ClassDat[Gbl.Prefs.Theme]);
Prf_GetAndShowRankingForPsts ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LT\"",The_ClassDat[Gbl.Prefs.Theme]);
Prf_GetAndShowRankingMsgsSnt ();
HTM_TD_End ();
HTM_TR_End ();
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/********* Get and show stats about hierarchy ***********/
/********* (countries, institutions, centers, degrees and courses) ***********/
/*****************************************************************************/
static void Hie_GetAndShowHierarchyStats (void)
{
extern const char *Hlp_ANALYTICS_Figures_hierarchy;
extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES];
Rol_Role_t Role;
/***** Begin box and table *****/
Box_BoxTableBegin (NULL,Txt_FIGURE_TYPES[Fig_HIERARCHY],
NULL,NULL,
Hlp_ANALYTICS_Figures_hierarchy,Box_NOT_CLOSABLE,2);
Fig_WriteHeadHierarchy ();
Fig_GetAndShowHierarchyWithInss ();
Fig_GetAndShowHierarchyWithCtrs ();
Fig_GetAndShowHierarchyWithDegs ();
Fig_GetAndShowHierarchyWithCrss ();
for (Role = Rol_TCH;
Role >= Rol_STD;
Role--)
Fig_GetAndShowHierarchyWithUsrs (Role);
Fig_GetAndShowHierarchyTotal ();
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/************************ Write head of hierarchy table **********************/
/*****************************************************************************/
static void Fig_WriteHeadHierarchy (void)
{
extern const char *Txt_Countries;
extern const char *Txt_Institutions;
extern const char *Txt_Centers;
extern const char *Txt_Degrees;
extern const char *Txt_Courses;
HTM_TR_Begin (NULL);
HTM_TH_Empty (1);
HTM_TH_Begin (HTM_HEAD_RIGHT);
Ico_PutIcon ("globe-americas.svg",Ico_BLACK,
Txt_Countries,"ICOx16");
HTM_BR ();
HTM_Txt (Txt_Countries);
HTM_TH_End ();
HTM_TH_Begin (HTM_HEAD_RIGHT);
Ico_PutIcon ("university.svg",Ico_BLACK,
Txt_Institutions,"ICOx16");
HTM_BR ();
HTM_Txt (Txt_Institutions);
HTM_TH_End ();
HTM_TH_Begin (HTM_HEAD_RIGHT);
Ico_PutIcon ("building.svg",Ico_BLACK,
Txt_Centers,"ICOx16");
HTM_BR ();
HTM_Txt (Txt_Centers);
HTM_TH_End ();
HTM_TH_Begin (HTM_HEAD_RIGHT);
Ico_PutIcon ("graduation-cap.svg",Ico_BLACK,
Txt_Degrees,"ICOx16");
HTM_BR ();
HTM_Txt (Txt_Degrees);
HTM_TH_End ();
HTM_TH_Begin (HTM_HEAD_RIGHT);
Ico_PutIcon ("chalkboard-teacher.svg",Ico_BLACK,
Txt_Courses,"ICOx16");
HTM_BR ();
HTM_Txt (Txt_Courses);
HTM_TH_End ();
HTM_TR_End ();
}
/*****************************************************************************/
/****** Get and show number of elements in hierarchy with institutions *******/
/*****************************************************************************/
static void Fig_GetAndShowHierarchyWithInss (void)
{
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_With_;
extern const char *Txt_institutions;
unsigned NumCtysWithInss = 1;
/***** Get number of elements with institutions *****/
switch (Gbl.Scope.Current)
{
case HieLvl_SYS:
NumCtysWithInss = Cty_GetCachedNumCtysWithInss ();
break;
case HieLvl_CTY:
case HieLvl_INS:
case HieLvl_CTR:
case HieLvl_DEG:
case HieLvl_CRS:
break;
default:
Err_WrongScopeExit ();
break;
}
/***** Write number of elements with institutions *****/
Fig_ShowHierarchyRow (Txt_With_,Txt_institutions,
The_ClassDat[Gbl.Prefs.Theme],
(int) NumCtysWithInss,
-1, // < 0 ==> do not show number
-1, // < 0 ==> do not show number
-1, // < 0 ==> do not show number
-1); // < 0 ==> do not show number
}
/*****************************************************************************/
/******** Get and show number of elements in hierarchy with centers **********/
/*****************************************************************************/
static void Fig_GetAndShowHierarchyWithCtrs (void)
{
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_With_;
extern const char *Txt_centers;
unsigned NumCtysWithCtrs = 1;
unsigned NumInssWithCtrs = 1;
/***** Get number of elements with centers *****/
switch (Gbl.Scope.Current)
{
case HieLvl_SYS:
NumCtysWithCtrs = Cty_GetCachedNumCtysWithCtrs ();
/* falls through */
/* no break */
case HieLvl_CTY:
NumInssWithCtrs = Ins_GetCachedNumInssWithCtrs ();
break;
case HieLvl_INS:
case HieLvl_CTR:
case HieLvl_DEG:
case HieLvl_CRS:
break;
default:
Err_WrongScopeExit ();
break;
}
/***** Write number of elements with centers *****/
Fig_ShowHierarchyRow (Txt_With_,Txt_centers,
The_ClassDat[Gbl.Prefs.Theme],
(int) NumCtysWithCtrs,
(int) NumInssWithCtrs,
-1, // < 0 ==> do not show number
-1, // < 0 ==> do not show number
-1); // < 0 ==> do not show number
}
/*****************************************************************************/
/******** Get and show number of elements in hierarchy with degrees **********/
/*****************************************************************************/
static void Fig_GetAndShowHierarchyWithDegs (void)
{
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_With_;
extern const char *Txt_degrees;
unsigned NumCtysWithDegs = 1;
unsigned NumInssWithDegs = 1;
unsigned NumCtrsWithDegs = 1;
/***** Get number of elements with degrees *****/
switch (Gbl.Scope.Current)
{
case HieLvl_SYS:
NumCtysWithDegs = Cty_GetCachedNumCtysWithDegs ();
/* falls through */
/* no break */
break;
case HieLvl_CTY:
NumInssWithDegs = Ins_GetCachedNumInssWithDegs ();
/* falls through */
/* no break */
case HieLvl_INS:
NumCtrsWithDegs = Ctr_GetCachedNumCtrsWithDegs ();
break;
case HieLvl_CTR:
case HieLvl_DEG:
case HieLvl_CRS:
break;
default:
Err_WrongScopeExit ();
break;
}
/***** Write number of elements with degrees *****/
Fig_ShowHierarchyRow (Txt_With_,Txt_degrees,
The_ClassDat[Gbl.Prefs.Theme],
(int) NumCtysWithDegs,
(int) NumInssWithDegs,
(int) NumCtrsWithDegs,
-1, // < 0 ==> do not show number
-1); // < 0 ==> do not show number
}
/*****************************************************************************/
/******** Get and show number of elements in hierarchy with courses **********/
/*****************************************************************************/
static void Fig_GetAndShowHierarchyWithCrss (void)
{
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_With_;
extern const char *Txt_courses;
unsigned NumCtysWithCrss = 1;
unsigned NumInssWithCrss = 1;
unsigned NumCtrsWithCrss = 1;
unsigned NumDegsWithCrss = 1;
/***** Get number of elements with courses *****/
switch (Gbl.Scope.Current)
{
case HieLvl_SYS:
NumCtysWithCrss = Cty_GetCachedNumCtysWithCrss ();
/* falls through */
/* no break */
case HieLvl_CTY:
NumInssWithCrss = Ins_GetCachedNumInssWithCrss ();
/* falls through */
/* no break */
case HieLvl_INS:
NumCtrsWithCrss = Ctr_GetCachedNumCtrsWithCrss ();
/* falls through */
/* no break */
case HieLvl_CTR:
NumDegsWithCrss = Deg_GetCachedNumDegsWithCrss ();
break;
case HieLvl_DEG:
case HieLvl_CRS:
break;
default:
Err_WrongScopeExit ();
break;
}
/***** Write number of elements with courses *****/
Fig_ShowHierarchyRow (Txt_With_,Txt_courses,
The_ClassDat[Gbl.Prefs.Theme],
(int) NumCtysWithCrss,
(int) NumInssWithCrss,
(int) NumCtrsWithCrss,
(int) NumDegsWithCrss,
-1); // < 0 ==> do not show number
}
/*****************************************************************************/
/********** Get and show number of elements in hierarchy with users **********/
/*****************************************************************************/
static void Fig_GetAndShowHierarchyWithUsrs (Rol_Role_t Role)
{
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_With_;
extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
unsigned NumCtysWithUsrs;
unsigned NumInssWithUsrs;
unsigned NumCtrsWithUsrs;
unsigned NumDegsWithUsrs;
unsigned NumCrssWithUsrs;
/***** Get number of elements with students *****/
NumCtysWithUsrs = Cty_GetCachedNumCtysWithUsrs (Role);
NumInssWithUsrs = Ins_GetCachedNumInssWithUsrs (Role);
NumCtrsWithUsrs = Ctr_GetCachedNumCtrsWithUsrs (Role);
NumDegsWithUsrs = Deg_GetCachedNumDegsWithUsrs (Role);
NumCrssWithUsrs = Crs_GetCachedNumCrssWithUsrs (Role);
/***** Write number of elements with students *****/
Fig_ShowHierarchyRow (Txt_With_,Txt_ROLES_PLURAL_abc[Role][Usr_SEX_UNKNOWN],
The_ClassDat[Gbl.Prefs.Theme],
(int) NumCtysWithUsrs,
(int) NumInssWithUsrs,
(int) NumCtrsWithUsrs,
(int) NumDegsWithUsrs,
(int) NumCrssWithUsrs);
}
/*****************************************************************************/
/************ Get and show total number of elements in hierarchy *************/
/*****************************************************************************/
static void Fig_GetAndShowHierarchyTotal (void)
{
extern const char *The_ClassDatStrong[The_NUM_THEMES];
extern const char *Txt_Total;
char *ClassTxt;
unsigned NumCtysTotal = 1;
unsigned NumInssTotal = 1;
unsigned NumCtrsTotal = 1;
unsigned NumDegsTotal = 1;
unsigned NumCrssTotal = 1;
/***** Get total number of elements *****/
switch (Gbl.Scope.Current)
{
case HieLvl_SYS:
NumCtysTotal = Cty_GetCachedNumCtysInSys ();
NumInssTotal = Ins_GetCachedNumInssInSys ();
NumCtrsTotal = Ctr_GetCachedNumCtrsInSys ();
NumDegsTotal = Deg_GetCachedNumDegsInSys ();
NumCrssTotal = Crs_GetCachedNumCrssInSys ();
break;
case HieLvl_CTY:
NumInssTotal = Ins_GetCachedNumInssInCty (Gbl.Hierarchy.Cty.CtyCod);
NumCtrsTotal = Ctr_GetCachedNumCtrsInCty (Gbl.Hierarchy.Cty.CtyCod);
NumDegsTotal = Deg_GetCachedNumDegsInCty (Gbl.Hierarchy.Cty.CtyCod);
NumCrssTotal = Crs_GetCachedNumCrssInCty (Gbl.Hierarchy.Cty.CtyCod);
break;
case HieLvl_INS:
NumCtrsTotal = Ctr_GetCachedNumCtrsInIns (Gbl.Hierarchy.Ins.InsCod);
NumDegsTotal = Deg_GetCachedNumDegsInIns (Gbl.Hierarchy.Ins.InsCod);
NumCrssTotal = Crs_GetCachedNumCrssInIns (Gbl.Hierarchy.Ins.InsCod);
break;
case HieLvl_CTR:
NumDegsTotal = Deg_GetCachedNumDegsInCtr (Gbl.Hierarchy.Ctr.CtrCod);
NumCrssTotal = Crs_GetCachedNumCrssInCtr (Gbl.Hierarchy.Ctr.CtrCod);
break;
case HieLvl_DEG:
NumCrssTotal = Crs_GetCachedNumCrssInDeg (Gbl.Hierarchy.Deg.DegCod);
break;
case HieLvl_CRS:
break;
default:
Err_WrongScopeExit ();
break;
}
/***** Write total number of elements *****/
if (asprintf (&ClassTxt,"%s LINE_TOP",The_ClassDatStrong[Gbl.Prefs.Theme]) < 0)
Err_NotEnoughMemoryExit ();
Fig_ShowHierarchyRow ("",Txt_Total,ClassTxt,
(int) NumCtysTotal,
(int) NumInssTotal,
(int) NumCtrsTotal,
(int) NumDegsTotal,
(int) NumCrssTotal);
free (ClassTxt);
}
/*****************************************************************************/
/************** Show row with number of elements in hierarchy ****************/
/*****************************************************************************/
static void Fig_ShowHierarchyRow (const char *Text1,const char *Text2,
const char *ClassTxt,
int NumCtys, // < 0 ==> do not show number
int NumInss, // < 0 ==> do not show number
int NumCtrs, // < 0 ==> do not show number
int NumDegs, // < 0 ==> do not show number
int NumCrss) // < 0 ==> do not show number
{
/***** Begin row *****/
HTM_TR_Begin (NULL);
/***** Write text *****/
HTM_TD_Begin ("class=\"%s RM\"",ClassTxt);
HTM_Txt (Text1);
HTM_Txt (Text2);
HTM_TD_End ();
/***** Write number of countries *****/
Fig_ShowHierarchyCell (ClassTxt,NumCtys);
Fig_ShowHierarchyCell (ClassTxt,NumInss);
Fig_ShowHierarchyCell (ClassTxt,NumCtrs);
Fig_ShowHierarchyCell (ClassTxt,NumDegs);
Fig_ShowHierarchyCell (ClassTxt,NumCrss);
/***** End row *****/
HTM_TR_End ();
}
static void Fig_ShowHierarchyCell (const char *ClassTxt,int Num)
{
/***** Write number *****/
HTM_TD_Begin ("class=\"%s RM\"",ClassTxt);
if (Num >= 0)
HTM_Unsigned ((unsigned) Num);
else // < 0 ==> do not show number
HTM_Hyphen ();
HTM_TD_End ();
}
/*****************************************************************************/
/****************** Get and show stats about institutions ********************/
/*****************************************************************************/
static void Ins_GetAndShowInstitutionsStats (void)
{
extern const char *Hlp_ANALYTICS_Figures_institutions;
extern const char *Txt_Institutions;
struct Fig_Figures Figures;
/***** Begin box *****/
Box_BoxBegin (NULL,Txt_Institutions,
NULL,NULL,
Hlp_ANALYTICS_Figures_institutions,Box_NOT_CLOSABLE);
/***** Form to select type of list used to display degree photos *****/
Set_GetAndUpdatePrefsAboutUsrList ();
Figures.Scope = Gbl.Scope.Current;
Figures.FigureType = Fig_INSTITS;
Usr_ShowFormsToSelectUsrListType (Fig_PutHiddenParamFigures,&Figures);
/***** Institutions ordered by number of centers *****/
Fig_GetAndShowInssOrderedByNumCtrs ();
/***** Institutions ordered by number of degrees *****/
Fig_GetAndShowInssOrderedByNumDegs ();
/***** Institutions ordered by number of courses *****/
Fig_GetAndShowInssOrderedByNumCrss ();
/***** Institutions ordered by number of users in courses *****/
Fig_GetAndShowInssOrderedByNumUsrsInCrss ();
/***** Institutions ordered by number of users who claim to belong to them *****/
Fig_GetAndShowInssOrderedByNumUsrsWhoClaimToBelongToThem ();
/***** End box *****/
Box_BoxEnd ();
}
/*****************************************************************************/
/**** Get and show stats about institutions ordered by number of centers *****/
/*****************************************************************************/
static void Fig_GetAndShowInssOrderedByNumCtrs (void)
{
extern const char *Txt_Institutions_by_number_of_centers;
extern const char *Txt_Centers;
MYSQL_RES *mysql_res;
unsigned NumInss;
/***** Begin box and table *****/
Box_BoxTableBegin ("100%",Txt_Institutions_by_number_of_centers,
NULL,NULL,
NULL,Box_NOT_CLOSABLE,2);
/***** Get institutions ordered by number of centers *****/
NumInss = Ins_DB_GetInssOrderedByNumCtrs (&mysql_res);
/***** Show institutions *****/
Fig_ShowInss (&mysql_res,NumInss,Txt_Centers);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/**** Get and show stats about institutions ordered by number of degrees *****/
/*****************************************************************************/
static void Fig_GetAndShowInssOrderedByNumDegs (void)
{
extern const char *Txt_Institutions_by_number_of_degrees;
extern const char *Txt_Degrees;
MYSQL_RES *mysql_res;
unsigned NumInss;
/***** Begin box and table *****/
Box_BoxTableBegin ("100%",Txt_Institutions_by_number_of_degrees,
NULL,NULL,
NULL,Box_NOT_CLOSABLE,2);
/***** Get institutions ordered by number of degrees *****/
NumInss = Ins_DB_GetInssOrderedByNumDegs (&mysql_res);
/***** Show institutions *****/
Fig_ShowInss (&mysql_res,NumInss,Txt_Degrees);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/**** Get and show stats about institutions ordered by number of courses *****/
/*****************************************************************************/
static void Fig_GetAndShowInssOrderedByNumCrss (void)
{
extern const char *Txt_Institutions_by_number_of_courses;
extern const char *Txt_Courses;
MYSQL_RES *mysql_res;
unsigned NumInss;
/***** Begin box and table *****/
Box_BoxTableBegin ("100%",Txt_Institutions_by_number_of_courses,
NULL,NULL,
NULL,Box_NOT_CLOSABLE,2);
/***** Get institutions ordered by number of courses *****/
NumInss = Ins_DB_GetInssOrderedByNumCrss (&mysql_res);
/***** Show institutions *****/
Fig_ShowInss (&mysql_res,NumInss,Txt_Courses);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/***** Get and show stats about institutions ordered by users in courses *****/
/*****************************************************************************/
static void Fig_GetAndShowInssOrderedByNumUsrsInCrss (void)
{
extern const char *Txt_Institutions_by_number_of_users_in_courses;
extern const char *Txt_Users;
MYSQL_RES *mysql_res;
unsigned NumInss;
/***** Begin box and table *****/
Box_BoxTableBegin ("100%",Txt_Institutions_by_number_of_users_in_courses,
NULL,NULL,
NULL,Box_NOT_CLOSABLE,2);
/***** Get institutions ordered by number of users in courses *****/
NumInss = Ins_DB_GetInssOrderedByNumUsrsInCrss (&mysql_res);
/***** Show institutions *****/
Fig_ShowInss (&mysql_res,NumInss,Txt_Users);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/************* Get and show stats about institutions ordered by **************/
/************* number of users who claim to belong to them **************/
/*****************************************************************************/
static void Fig_GetAndShowInssOrderedByNumUsrsWhoClaimToBelongToThem (void)
{
extern const char *Txt_Institutions_by_number_of_users_who_claim_to_belong_to_them;
extern const char *Txt_Users;
MYSQL_RES *mysql_res;
unsigned NumInss;
/***** Begin box and table *****/
Box_BoxTableBegin ("100%",Txt_Institutions_by_number_of_users_who_claim_to_belong_to_them,
NULL,NULL,
NULL,Box_NOT_CLOSABLE,2);
/***** Get institutions ordered by number of users who claim to belong to them *****/
NumInss = Ins_DB_GetInssOrderedByNumUsrsWhoClaimToBelongToThem (&mysql_res);
/***** Show institutions *****/
Fig_ShowInss (&mysql_res,NumInss,Txt_Users);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/****************** Get and show stats about institutions ********************/
/*****************************************************************************/
static void Fig_ShowInss (MYSQL_RES **mysql_res,unsigned NumInss,
const char *TxtFigure)
{
extern const char *The_ClassFormInBox[The_NUM_THEMES];
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_Institution;
unsigned NumIns;
unsigned NumOrder;
unsigned NumberLastRow;
unsigned NumberThisRow;
struct Ins_Instit Ins;
bool TRIsOpen = false;
/***** Query database *****/
if (NumInss)
{
/* Draw the classphoto/list */
switch (Gbl.Usrs.Me.ListType)
{
case Set_USR_LIST_AS_CLASS_PHOTO:
/***** Draw institutions as a class photo *****/
for (NumIns = 0;
NumIns < NumInss;)
{
if ((NumIns % Gbl.Usrs.ClassPhoto.Cols) == 0)
{
HTM_TR_Begin (NULL);
TRIsOpen = true;
}
/***** Get institution data and statistic *****/
NumberThisRow = Fig_GetInsAndStat (&Ins,*mysql_res);
/***** Write link to institution *****/
HTM_TD_Begin ("class=\"%s CM\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
Ins_DrawInstitutionLogoWithLink (&Ins,40);
HTM_BR ();
HTM_Unsigned (NumberThisRow);
HTM_TD_End ();
if ((++NumIns % Gbl.Usrs.ClassPhoto.Cols) == 0)
{
HTM_TR_End ();
TRIsOpen = false;
}
}
if (TRIsOpen)
HTM_TR_End ();
break;
case Set_USR_LIST_AS_LISTING:
/***** Draw institutions as a list *****/
HTM_TR_Begin (NULL);
HTM_TH_Empty (1);
HTM_TH (Txt_Institution,HTM_HEAD_LEFT);
HTM_TH (TxtFigure ,HTM_HEAD_RIGHT);
HTM_TR_End ();
for (NumIns = 1, NumOrder = 1, NumberLastRow = 0;
NumIns <= NumInss;
NumIns++)
{
/***** Get institution data and statistic *****/
NumberThisRow = Fig_GetInsAndStat (&Ins,*mysql_res);
HTM_TR_Begin (NULL);
/***** Number of order *****/
if (NumberThisRow != NumberLastRow)
NumOrder = NumIns;
HTM_TD_Begin ("class=\"%s RM\"",The_ClassDat[Gbl.Prefs.Theme]);
HTM_Unsigned (NumOrder);
HTM_TD_End ();
/***** Write link to institution *****/
HTM_TD_Begin ("class=\"%s LM\"",
The_ClassFormInBox[Gbl.Prefs.Theme]);
/* Icon and name of this institution */
Frm_BeginForm (ActSeeInsInf);
Ins_PutParamInsCod (Ins.InsCod);
HTM_BUTTON_OnSubmit_Begin (Ins.ShrtName,"BT_LINK",NULL);
if (Gbl.Usrs.Listing.WithPhotos)
{
Lgo_DrawLogo (HieLvl_INS,Ins.InsCod,Ins.ShrtName,
40,NULL,true);
HTM_NBSP ();
}
HTM_Txt (Ins.FullName);
HTM_BUTTON_End ();
Frm_EndForm ();
HTM_TD_End ();
/***** Write statistic *****/
HTM_TD_Begin ("class=\"%s RM\"",The_ClassDat[Gbl.Prefs.Theme]);
HTM_Unsigned (NumberThisRow);
HTM_TD_End ();
HTM_TR_End ();
NumberLastRow = NumberThisRow;
}
break;
default:
break;
}
}
}
/*****************************************************************************/
/******************** Get institution data and statistic *********************/
/*****************************************************************************/
static unsigned Fig_GetInsAndStat (struct Ins_Instit *Ins,MYSQL_RES *mysql_res)
{
MYSQL_ROW row;
unsigned NumberThisRow;
/***** Get next institution *****/
row = mysql_fetch_row (mysql_res);
/***** Get data of this institution (row[0]) *****/
Ins->InsCod = Str_ConvertStrCodToLongCod (row[0]);
if (!Ins_GetDataOfInstitByCod (Ins))
Err_WrongInstitExit ();
/***** Get statistic (row[1]) *****/
if (sscanf (row[1],"%u",&NumberThisRow) != 1)
Err_ShowErrorAndExit ("Error in statistic");
return NumberThisRow;
}
/*****************************************************************************/
/****************** Get and show stats about institutions ********************/
/*****************************************************************************/

View File

@ -754,7 +754,7 @@ static void Fol_PutIconToFollow (const char EncryptedUsrCod[Cry_BYTES_ENCRYPTED_
/***** Form to unfollow *****/
Frm_BeginForm (ActFolUsr);
Usr_PutParamUsrCodEncrypted (EncryptedUsrCod);
if (asprintf (&Class,"FOLLOW_USR_ICO %s ICO_HIGHLIGHT ICO16x16",
if (asprintf (&Class,"FOLLOW_USR_ICO ICO16x16 %s ICO_HIGHLIGHT",
Ico_ClassColor[Ico_BLACK][Gbl.Prefs.Theme]) < 0)
Err_NotEnoughMemoryExit ();
HTM_INPUT_IMAGE (Cfg_URL_ICON_PUBLIC,"user-plus.svg",Txt_Follow,Class);

View File

@ -32,6 +32,7 @@
#include "swad_database.h"
#include "swad_degree_database.h"
#include "swad_error.h"
#include "swad_figure.h"
#include "swad_form.h"
#include "swad_global.h"
#include "swad_group_database.h"
@ -54,6 +55,22 @@ extern struct Globals Gbl;
static Hie_StatusTxt_t Hie_GetStatusTxtFromStatusBits (Hie_Status_t Status);
static Hie_Status_t Hie_GetStatusBitsFromStatusTxt (Hie_StatusTxt_t StatusTxt);
static void Hie_WriteHeadHierarchy (void);
static void Hie_GetAndShowHierarchyWithInss (void);
static void Hie_GetAndShowHierarchyWithCtrs (void);
static void Hie_GetAndShowHierarchyWithDegs (void);
static void Hie_GetAndShowHierarchyWithCrss (void);
static void Hie_GetAndShowHierarchyWithUsrs (Rol_Role_t Role);
static void Hie_GetAndShowHierarchyTotal (void);
static void Hie_ShowHierarchyRow (const char *Text1,const char *Text2,
const char *ClassTxt,
int NumCtys, // < 0 ==> do not show number
int NumInss, // < 0 ==> do not show number
int NumCtrs, // < 0 ==> do not show number
int NumDegs, // < 0 ==> do not show number
int NumCrss); // < 0 ==> do not show number
static void Hie_ShowHierarchyCell (const char *ClassTxt,int Num);
/*****************************************************************************/
/********** List pending institutions, centers, degrees and courses **********/
/*****************************************************************************/
@ -870,3 +887,402 @@ long Hie_GetAndCheckParamOtherHieCod (long MinCodAllowed)
return HieCod;
}
/*****************************************************************************/
/********* Get and show stats about hierarchy ***********/
/********* (countries, institutions, centers, degrees and courses) ***********/
/*****************************************************************************/
void Hie_GetAndShowHierarchyStats (void)
{
extern const char *Hlp_ANALYTICS_Figures_hierarchy;
extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES];
Rol_Role_t Role;
/***** Begin box and table *****/
Box_BoxTableBegin (NULL,Txt_FIGURE_TYPES[Fig_HIERARCHY],
NULL,NULL,
Hlp_ANALYTICS_Figures_hierarchy,Box_NOT_CLOSABLE,2);
Hie_WriteHeadHierarchy ();
Hie_GetAndShowHierarchyWithInss ();
Hie_GetAndShowHierarchyWithCtrs ();
Hie_GetAndShowHierarchyWithDegs ();
Hie_GetAndShowHierarchyWithCrss ();
for (Role = Rol_TCH;
Role >= Rol_STD;
Role--)
Hie_GetAndShowHierarchyWithUsrs (Role);
Hie_GetAndShowHierarchyTotal ();
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/************************ Write head of hierarchy table **********************/
/*****************************************************************************/
static void Hie_WriteHeadHierarchy (void)
{
extern const char *Txt_Countries;
extern const char *Txt_Institutions;
extern const char *Txt_Centers;
extern const char *Txt_Degrees;
extern const char *Txt_Courses;
HTM_TR_Begin (NULL);
HTM_TH_Empty (1);
HTM_TH_Begin (HTM_HEAD_RIGHT);
Ico_PutIcon ("globe-americas.svg",Ico_BLACK,
Txt_Countries,"ICOx16");
HTM_BR ();
HTM_Txt (Txt_Countries);
HTM_TH_End ();
HTM_TH_Begin (HTM_HEAD_RIGHT);
Ico_PutIcon ("university.svg",Ico_BLACK,
Txt_Institutions,"ICOx16");
HTM_BR ();
HTM_Txt (Txt_Institutions);
HTM_TH_End ();
HTM_TH_Begin (HTM_HEAD_RIGHT);
Ico_PutIcon ("building.svg",Ico_BLACK,
Txt_Centers,"ICOx16");
HTM_BR ();
HTM_Txt (Txt_Centers);
HTM_TH_End ();
HTM_TH_Begin (HTM_HEAD_RIGHT);
Ico_PutIcon ("graduation-cap.svg",Ico_BLACK,
Txt_Degrees,"ICOx16");
HTM_BR ();
HTM_Txt (Txt_Degrees);
HTM_TH_End ();
HTM_TH_Begin (HTM_HEAD_RIGHT);
Ico_PutIcon ("chalkboard-teacher.svg",Ico_BLACK,
Txt_Courses,"ICOx16");
HTM_BR ();
HTM_Txt (Txt_Courses);
HTM_TH_End ();
HTM_TR_End ();
}
/*****************************************************************************/
/****** Get and show number of elements in hierarchy with institutions *******/
/*****************************************************************************/
static void Hie_GetAndShowHierarchyWithInss (void)
{
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_With_;
extern const char *Txt_institutions;
unsigned NumCtysWithInss = 1;
/***** Get number of elements with institutions *****/
switch (Gbl.Scope.Current)
{
case HieLvl_SYS:
NumCtysWithInss = Cty_GetCachedNumCtysWithInss ();
break;
case HieLvl_CTY:
case HieLvl_INS:
case HieLvl_CTR:
case HieLvl_DEG:
case HieLvl_CRS:
break;
default:
Err_WrongScopeExit ();
break;
}
/***** Write number of elements with institutions *****/
Hie_ShowHierarchyRow (Txt_With_,Txt_institutions,
The_ClassDat[Gbl.Prefs.Theme],
(int) NumCtysWithInss,
-1, // < 0 ==> do not show number
-1, // < 0 ==> do not show number
-1, // < 0 ==> do not show number
-1); // < 0 ==> do not show number
}
/*****************************************************************************/
/******** Get and show number of elements in hierarchy with centers **********/
/*****************************************************************************/
static void Hie_GetAndShowHierarchyWithCtrs (void)
{
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_With_;
extern const char *Txt_centers;
unsigned NumCtysWithCtrs = 1;
unsigned NumInssWithCtrs = 1;
/***** Get number of elements with centers *****/
switch (Gbl.Scope.Current)
{
case HieLvl_SYS:
NumCtysWithCtrs = Cty_GetCachedNumCtysWithCtrs ();
/* falls through */
/* no break */
case HieLvl_CTY:
NumInssWithCtrs = Ins_GetCachedNumInssWithCtrs ();
break;
case HieLvl_INS:
case HieLvl_CTR:
case HieLvl_DEG:
case HieLvl_CRS:
break;
default:
Err_WrongScopeExit ();
break;
}
/***** Write number of elements with centers *****/
Hie_ShowHierarchyRow (Txt_With_,Txt_centers,
The_ClassDat[Gbl.Prefs.Theme],
(int) NumCtysWithCtrs,
(int) NumInssWithCtrs,
-1, // < 0 ==> do not show number
-1, // < 0 ==> do not show number
-1); // < 0 ==> do not show number
}
/*****************************************************************************/
/******** Get and show number of elements in hierarchy with degrees **********/
/*****************************************************************************/
static void Hie_GetAndShowHierarchyWithDegs (void)
{
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_With_;
extern const char *Txt_degrees;
unsigned NumCtysWithDegs = 1;
unsigned NumInssWithDegs = 1;
unsigned NumCtrsWithDegs = 1;
/***** Get number of elements with degrees *****/
switch (Gbl.Scope.Current)
{
case HieLvl_SYS:
NumCtysWithDegs = Cty_GetCachedNumCtysWithDegs ();
/* falls through */
/* no break */
break;
case HieLvl_CTY:
NumInssWithDegs = Ins_GetCachedNumInssWithDegs ();
/* falls through */
/* no break */
case HieLvl_INS:
NumCtrsWithDegs = Ctr_GetCachedNumCtrsWithDegs ();
break;
case HieLvl_CTR:
case HieLvl_DEG:
case HieLvl_CRS:
break;
default:
Err_WrongScopeExit ();
break;
}
/***** Write number of elements with degrees *****/
Hie_ShowHierarchyRow (Txt_With_,Txt_degrees,
The_ClassDat[Gbl.Prefs.Theme],
(int) NumCtysWithDegs,
(int) NumInssWithDegs,
(int) NumCtrsWithDegs,
-1, // < 0 ==> do not show number
-1); // < 0 ==> do not show number
}
/*****************************************************************************/
/******** Get and show number of elements in hierarchy with courses **********/
/*****************************************************************************/
static void Hie_GetAndShowHierarchyWithCrss (void)
{
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_With_;
extern const char *Txt_courses;
unsigned NumCtysWithCrss = 1;
unsigned NumInssWithCrss = 1;
unsigned NumCtrsWithCrss = 1;
unsigned NumDegsWithCrss = 1;
/***** Get number of elements with courses *****/
switch (Gbl.Scope.Current)
{
case HieLvl_SYS:
NumCtysWithCrss = Cty_GetCachedNumCtysWithCrss ();
/* falls through */
/* no break */
case HieLvl_CTY:
NumInssWithCrss = Ins_GetCachedNumInssWithCrss ();
/* falls through */
/* no break */
case HieLvl_INS:
NumCtrsWithCrss = Ctr_GetCachedNumCtrsWithCrss ();
/* falls through */
/* no break */
case HieLvl_CTR:
NumDegsWithCrss = Deg_GetCachedNumDegsWithCrss ();
break;
case HieLvl_DEG:
case HieLvl_CRS:
break;
default:
Err_WrongScopeExit ();
break;
}
/***** Write number of elements with courses *****/
Hie_ShowHierarchyRow (Txt_With_,Txt_courses,
The_ClassDat[Gbl.Prefs.Theme],
(int) NumCtysWithCrss,
(int) NumInssWithCrss,
(int) NumCtrsWithCrss,
(int) NumDegsWithCrss,
-1); // < 0 ==> do not show number
}
/*****************************************************************************/
/********** Get and show number of elements in hierarchy with users **********/
/*****************************************************************************/
static void Hie_GetAndShowHierarchyWithUsrs (Rol_Role_t Role)
{
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_With_;
extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
unsigned NumCtysWithUsrs;
unsigned NumInssWithUsrs;
unsigned NumCtrsWithUsrs;
unsigned NumDegsWithUsrs;
unsigned NumCrssWithUsrs;
/***** Get number of elements with students *****/
NumCtysWithUsrs = Cty_GetCachedNumCtysWithUsrs (Role);
NumInssWithUsrs = Ins_GetCachedNumInssWithUsrs (Role);
NumCtrsWithUsrs = Ctr_GetCachedNumCtrsWithUsrs (Role);
NumDegsWithUsrs = Deg_GetCachedNumDegsWithUsrs (Role);
NumCrssWithUsrs = Crs_GetCachedNumCrssWithUsrs (Role);
/***** Write number of elements with students *****/
Hie_ShowHierarchyRow (Txt_With_,Txt_ROLES_PLURAL_abc[Role][Usr_SEX_UNKNOWN],
The_ClassDat[Gbl.Prefs.Theme],
(int) NumCtysWithUsrs,
(int) NumInssWithUsrs,
(int) NumCtrsWithUsrs,
(int) NumDegsWithUsrs,
(int) NumCrssWithUsrs);
}
/*****************************************************************************/
/************ Get and show total number of elements in hierarchy *************/
/*****************************************************************************/
static void Hie_GetAndShowHierarchyTotal (void)
{
extern const char *The_ClassDatStrong[The_NUM_THEMES];
extern const char *Txt_Total;
char *ClassTxt;
unsigned NumCtysTotal = 1;
unsigned NumInssTotal = 1;
unsigned NumCtrsTotal = 1;
unsigned NumDegsTotal = 1;
unsigned NumCrssTotal = 1;
/***** Get total number of elements *****/
switch (Gbl.Scope.Current)
{
case HieLvl_SYS:
NumCtysTotal = Cty_GetCachedNumCtysInSys ();
NumInssTotal = Ins_GetCachedNumInssInSys ();
NumCtrsTotal = Ctr_GetCachedNumCtrsInSys ();
NumDegsTotal = Deg_GetCachedNumDegsInSys ();
NumCrssTotal = Crs_GetCachedNumCrssInSys ();
break;
case HieLvl_CTY:
NumInssTotal = Ins_GetCachedNumInssInCty (Gbl.Hierarchy.Cty.CtyCod);
NumCtrsTotal = Ctr_GetCachedNumCtrsInCty (Gbl.Hierarchy.Cty.CtyCod);
NumDegsTotal = Deg_GetCachedNumDegsInCty (Gbl.Hierarchy.Cty.CtyCod);
NumCrssTotal = Crs_GetCachedNumCrssInCty (Gbl.Hierarchy.Cty.CtyCod);
break;
case HieLvl_INS:
NumCtrsTotal = Ctr_GetCachedNumCtrsInIns (Gbl.Hierarchy.Ins.InsCod);
NumDegsTotal = Deg_GetCachedNumDegsInIns (Gbl.Hierarchy.Ins.InsCod);
NumCrssTotal = Crs_GetCachedNumCrssInIns (Gbl.Hierarchy.Ins.InsCod);
break;
case HieLvl_CTR:
NumDegsTotal = Deg_GetCachedNumDegsInCtr (Gbl.Hierarchy.Ctr.CtrCod);
NumCrssTotal = Crs_GetCachedNumCrssInCtr (Gbl.Hierarchy.Ctr.CtrCod);
break;
case HieLvl_DEG:
NumCrssTotal = Crs_GetCachedNumCrssInDeg (Gbl.Hierarchy.Deg.DegCod);
break;
case HieLvl_CRS:
break;
default:
Err_WrongScopeExit ();
break;
}
/***** Write total number of elements *****/
if (asprintf (&ClassTxt,"%s LINE_TOP",The_ClassDatStrong[Gbl.Prefs.Theme]) < 0)
Err_NotEnoughMemoryExit ();
Hie_ShowHierarchyRow ("",Txt_Total,ClassTxt,
(int) NumCtysTotal,
(int) NumInssTotal,
(int) NumCtrsTotal,
(int) NumDegsTotal,
(int) NumCrssTotal);
free (ClassTxt);
}
/*****************************************************************************/
/************** Show row with number of elements in hierarchy ****************/
/*****************************************************************************/
static void Hie_ShowHierarchyRow (const char *Text1,const char *Text2,
const char *ClassTxt,
int NumCtys, // < 0 ==> do not show number
int NumInss, // < 0 ==> do not show number
int NumCtrs, // < 0 ==> do not show number
int NumDegs, // < 0 ==> do not show number
int NumCrss) // < 0 ==> do not show number
{
/***** Begin row *****/
HTM_TR_Begin (NULL);
/***** Write text *****/
HTM_TD_Begin ("class=\"%s RM\"",ClassTxt);
HTM_Txt (Text1);
HTM_Txt (Text2);
HTM_TD_End ();
/***** Write number of countries *****/
Hie_ShowHierarchyCell (ClassTxt,NumCtys);
Hie_ShowHierarchyCell (ClassTxt,NumInss);
Hie_ShowHierarchyCell (ClassTxt,NumCtrs);
Hie_ShowHierarchyCell (ClassTxt,NumDegs);
Hie_ShowHierarchyCell (ClassTxt,NumCrss);
/***** End row *****/
HTM_TR_End ();
}
static void Hie_ShowHierarchyCell (const char *ClassTxt,int Num)
{
/***** Write number *****/
HTM_TD_Begin ("class=\"%s RM\"",ClassTxt);
if (Num >= 0)
HTM_Unsigned ((unsigned) Num);
else // < 0 ==> do not show number
HTM_Hyphen ();
HTM_TD_End ();
}

View File

@ -72,4 +72,7 @@ Hie_Status_t Hie_GetParamStatus (void);
void Hie_PutParamOtherHieCod (void *HieCod);
long Hie_GetAndCheckParamOtherHieCod (long MinCodAllowed);
//-------------------------------- Figures ------------------------------------
void Hie_GetAndShowHierarchyStats (void);
#endif

View File

@ -101,6 +101,15 @@ static void Ins_EditingInstitutionDestructor ();
static void Ins_FormToGoToMap (struct Ins_Instit *Ins);
static void Ins_GetAndShowInssOrderedByNumCtrs (void);
static void Ins_GetAndShowInssOrderedByNumDegs (void);
static void Ins_GetAndShowInssOrderedByNumCrss (void);
static void Ins_GetAndShowInssOrderedByNumUsrsInCrss (void);
static void Ins_GetAndShowInssOrderedByNumUsrsWhoClaimToBelongToThem (void);
static void Ins_ShowInss (MYSQL_RES **mysql_res,unsigned NumInss,
const char *TxtFigure);
static unsigned Ins_GetInsAndStat (struct Ins_Instit *Ins,MYSQL_RES *mysql_res);
/*****************************************************************************/
/***************** List institutions with pending centers ********************/
/*****************************************************************************/
@ -228,7 +237,7 @@ void Ins_DrawInstitLogoAndNameWithLink (struct Ins_Instit *Ins,Act_Action_t Acti
/***** Link to action *****/
HTM_BUTTON_OnSubmit_Begin (Str_BuildGoToTitle (Ins->FullName),
"BT_LINK",NULL);
"BT_LINK LT",NULL);
Str_FreeGoToTitle ();
/***** Institution logo and name *****/
@ -391,7 +400,7 @@ static void Ins_ListOneInstitutionForSeeing (struct Ins_Instit *Ins,unsigned Num
HTM_TD_End ();
/***** Institution logo and name *****/
HTM_TD_Begin ("class=\"LM %s\"",BgColor);
HTM_TD_Begin ("class=\"%s LM %s\"",TxtClassStrong,BgColor);
Ins_DrawInstitLogoAndNameWithLink (Ins,ActSeeCtr,"CM");
HTM_TD_End ();
@ -2066,3 +2075,325 @@ unsigned Ins_GetCachedNumUsrsWhoClaimToBelongToIns (struct Ins_Instit *Ins)
return NumUsrsIns;
}
/*****************************************************************************/
/****************** Get and show stats about institutions ********************/
/*****************************************************************************/
void Ins_GetAndShowInstitutionsStats (void)
{
extern const char *Hlp_ANALYTICS_Figures_institutions;
extern const char *Txt_Institutions;
struct Fig_Figures Figures;
/***** Begin box *****/
Box_BoxBegin (NULL,Txt_Institutions,
NULL,NULL,
Hlp_ANALYTICS_Figures_institutions,Box_NOT_CLOSABLE);
/***** Form to select type of list used to display degree photos *****/
Set_GetAndUpdatePrefsAboutUsrList ();
Figures.Scope = Gbl.Scope.Current;
Figures.FigureType = Fig_INSTITS;
Usr_ShowFormsToSelectUsrListType (Fig_PutHiddenParamFigures,&Figures);
/***** Institutions ordered by number of centers *****/
Ins_GetAndShowInssOrderedByNumCtrs ();
/***** Institutions ordered by number of degrees *****/
Ins_GetAndShowInssOrderedByNumDegs ();
/***** Institutions ordered by number of courses *****/
Ins_GetAndShowInssOrderedByNumCrss ();
/***** Institutions ordered by number of users in courses *****/
Ins_GetAndShowInssOrderedByNumUsrsInCrss ();
/***** Institutions ordered by number of users who claim to belong to them *****/
Ins_GetAndShowInssOrderedByNumUsrsWhoClaimToBelongToThem ();
/***** End box *****/
Box_BoxEnd ();
}
/*****************************************************************************/
/**** Get and show stats about institutions ordered by number of centers *****/
/*****************************************************************************/
static void Ins_GetAndShowInssOrderedByNumCtrs (void)
{
extern const char *Txt_Institutions_by_number_of_centers;
extern const char *Txt_Centers;
MYSQL_RES *mysql_res;
unsigned NumInss;
/***** Begin box and table *****/
Box_BoxTableBegin ("100%",Txt_Institutions_by_number_of_centers,
NULL,NULL,
NULL,Box_NOT_CLOSABLE,2);
/***** Get institutions ordered by number of centers *****/
NumInss = Ins_DB_GetInssOrderedByNumCtrs (&mysql_res);
/***** Show institutions *****/
Ins_ShowInss (&mysql_res,NumInss,Txt_Centers);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/**** Get and show stats about institutions ordered by number of degrees *****/
/*****************************************************************************/
static void Ins_GetAndShowInssOrderedByNumDegs (void)
{
extern const char *Txt_Institutions_by_number_of_degrees;
extern const char *Txt_Degrees;
MYSQL_RES *mysql_res;
unsigned NumInss;
/***** Begin box and table *****/
Box_BoxTableBegin ("100%",Txt_Institutions_by_number_of_degrees,
NULL,NULL,
NULL,Box_NOT_CLOSABLE,2);
/***** Get institutions ordered by number of degrees *****/
NumInss = Ins_DB_GetInssOrderedByNumDegs (&mysql_res);
/***** Show institutions *****/
Ins_ShowInss (&mysql_res,NumInss,Txt_Degrees);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/**** Get and show stats about institutions ordered by number of courses *****/
/*****************************************************************************/
static void Ins_GetAndShowInssOrderedByNumCrss (void)
{
extern const char *Txt_Institutions_by_number_of_courses;
extern const char *Txt_Courses;
MYSQL_RES *mysql_res;
unsigned NumInss;
/***** Begin box and table *****/
Box_BoxTableBegin ("100%",Txt_Institutions_by_number_of_courses,
NULL,NULL,
NULL,Box_NOT_CLOSABLE,2);
/***** Get institutions ordered by number of courses *****/
NumInss = Ins_DB_GetInssOrderedByNumCrss (&mysql_res);
/***** Show institutions *****/
Ins_ShowInss (&mysql_res,NumInss,Txt_Courses);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/***** Get and show stats about institutions ordered by users in courses *****/
/*****************************************************************************/
static void Ins_GetAndShowInssOrderedByNumUsrsInCrss (void)
{
extern const char *Txt_Institutions_by_number_of_users_in_courses;
extern const char *Txt_Users;
MYSQL_RES *mysql_res;
unsigned NumInss;
/***** Begin box and table *****/
Box_BoxTableBegin ("100%",Txt_Institutions_by_number_of_users_in_courses,
NULL,NULL,
NULL,Box_NOT_CLOSABLE,2);
/***** Get institutions ordered by number of users in courses *****/
NumInss = Ins_DB_GetInssOrderedByNumUsrsInCrss (&mysql_res);
/***** Show institutions *****/
Ins_ShowInss (&mysql_res,NumInss,Txt_Users);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/************* Get and show stats about institutions ordered by **************/
/************* number of users who claim to belong to them **************/
/*****************************************************************************/
static void Ins_GetAndShowInssOrderedByNumUsrsWhoClaimToBelongToThem (void)
{
extern const char *Txt_Institutions_by_number_of_users_who_claim_to_belong_to_them;
extern const char *Txt_Users;
MYSQL_RES *mysql_res;
unsigned NumInss;
/***** Begin box and table *****/
Box_BoxTableBegin ("100%",Txt_Institutions_by_number_of_users_who_claim_to_belong_to_them,
NULL,NULL,
NULL,Box_NOT_CLOSABLE,2);
/***** Get institutions ordered by number of users who claim to belong to them *****/
NumInss = Ins_DB_GetInssOrderedByNumUsrsWhoClaimToBelongToThem (&mysql_res);
/***** Show institutions *****/
Ins_ShowInss (&mysql_res,NumInss,Txt_Users);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/****************** Get and show stats about institutions ********************/
/*****************************************************************************/
static void Ins_ShowInss (MYSQL_RES **mysql_res,unsigned NumInss,
const char *TxtFigure)
{
extern const char *The_ClassFormInBox[The_NUM_THEMES];
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_Institution;
unsigned NumIns;
unsigned NumOrder;
unsigned NumberLastRow;
unsigned NumberThisRow;
struct Ins_Instit Ins;
bool TRIsOpen = false;
/***** Query database *****/
if (NumInss)
{
/* Draw the classphoto/list */
switch (Gbl.Usrs.Me.ListType)
{
case Set_USR_LIST_AS_CLASS_PHOTO:
/***** Draw institutions as a class photo *****/
for (NumIns = 0;
NumIns < NumInss;)
{
if ((NumIns % Gbl.Usrs.ClassPhoto.Cols) == 0)
{
HTM_TR_Begin (NULL);
TRIsOpen = true;
}
/***** Get institution data and statistic *****/
NumberThisRow = Ins_GetInsAndStat (&Ins,*mysql_res);
/***** Write link to institution *****/
HTM_TD_Begin ("class=\"%s CM\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
Ins_DrawInstitutionLogoWithLink (&Ins,40);
HTM_BR ();
HTM_Unsigned (NumberThisRow);
HTM_TD_End ();
if ((++NumIns % Gbl.Usrs.ClassPhoto.Cols) == 0)
{
HTM_TR_End ();
TRIsOpen = false;
}
}
if (TRIsOpen)
HTM_TR_End ();
break;
case Set_USR_LIST_AS_LISTING:
/***** Draw institutions as a list *****/
HTM_TR_Begin (NULL);
HTM_TH_Empty (1);
HTM_TH (Txt_Institution,HTM_HEAD_LEFT);
HTM_TH (TxtFigure ,HTM_HEAD_RIGHT);
HTM_TR_End ();
for (NumIns = 1, NumOrder = 1, NumberLastRow = 0;
NumIns <= NumInss;
NumIns++)
{
/***** Get institution data and statistic *****/
NumberThisRow = Ins_GetInsAndStat (&Ins,*mysql_res);
HTM_TR_Begin (NULL);
/***** Number of order *****/
if (NumberThisRow != NumberLastRow)
NumOrder = NumIns;
HTM_TD_Begin ("class=\"%s RM\"",The_ClassDat[Gbl.Prefs.Theme]);
HTM_Unsigned (NumOrder);
HTM_TD_End ();
/***** Write link to institution *****/
HTM_TD_Begin ("class=\"%s LM\"",
The_ClassFormInBox[Gbl.Prefs.Theme]);
/* Icon and name of this institution */
Frm_BeginForm (ActSeeInsInf);
Ins_PutParamInsCod (Ins.InsCod);
HTM_BUTTON_OnSubmit_Begin (Ins.ShrtName,"BT_LINK",NULL);
if (Gbl.Usrs.Listing.WithPhotos)
{
Lgo_DrawLogo (HieLvl_INS,Ins.InsCod,Ins.ShrtName,
40,NULL,true);
HTM_NBSP ();
}
HTM_Txt (Ins.FullName);
HTM_BUTTON_End ();
Frm_EndForm ();
HTM_TD_End ();
/***** Write statistic *****/
HTM_TD_Begin ("class=\"%s RM\"",The_ClassDat[Gbl.Prefs.Theme]);
HTM_Unsigned (NumberThisRow);
HTM_TD_End ();
HTM_TR_End ();
NumberLastRow = NumberThisRow;
}
break;
default:
break;
}
}
}
/*****************************************************************************/
/******************** Get institution data and statistic *********************/
/*****************************************************************************/
static unsigned Ins_GetInsAndStat (struct Ins_Instit *Ins,MYSQL_RES *mysql_res)
{
MYSQL_ROW row;
unsigned NumberThisRow;
/***** Get next institution *****/
row = mysql_fetch_row (mysql_res);
/***** Get data of this institution (row[0]) *****/
Ins->InsCod = Str_ConvertStrCodToLongCod (row[0]);
if (!Ins_GetDataOfInstitByCod (Ins))
Err_WrongInstitExit ();
/***** Get statistic (row[1]) *****/
if (sscanf (row[1],"%u",&NumberThisRow) != 1)
Err_ShowErrorAndExit ("Error in statistic");
return NumberThisRow;
}

View File

@ -128,4 +128,7 @@ void Ins_FlushCacheNumUsrsWhoClaimToBelongToIns (void);
unsigned Ins_GetNumUsrsWhoClaimToBelongToIns (struct Ins_Instit *Ins);
unsigned Ins_GetCachedNumUsrsWhoClaimToBelongToIns (struct Ins_Instit *Ins);
//-------------------------------- Figures ------------------------------------
void Ins_GetAndShowInstitutionsStats (void);
#endif

View File

@ -63,6 +63,7 @@ static void Lgo_PutIconToRemoveLogo (Act_Action_t ActionRem);
void Lgo_DrawLogo (HieLvl_Level_t Scope,long Cod,const char *AltText,
unsigned Size,const char *Class,bool PutIconIfNotExists)
{
extern const char *Ico_ClassColor[Ico_NUM_COLORS][The_NUM_THEMES];
static const char *HieIcon[HieLvl_NUM_LEVELS] =
{
[HieLvl_UNK] = "sitemap.svg", // not applicable here
@ -82,6 +83,7 @@ void Lgo_DrawLogo (HieLvl_Level_t Scope,long Cod,const char *AltText,
char *URL;
char *Icon;
bool ClassNotEmpty;
Ico_Color_t Color;
/***** Path to logo *****/
if (HieIcon[Scope]) // Scope is correct
@ -153,6 +155,7 @@ void Lgo_DrawLogo (HieLvl_Level_t Scope,long Cod,const char *AltText,
Err_NotEnoughMemoryExit ();
if (asprintf (&Icon,"%u.png",(unsigned) Cod) < 0)
Err_NotEnoughMemoryExit ();
Color = Ico_UNCHANGED;
}
else
{
@ -160,14 +163,20 @@ void Lgo_DrawLogo (HieLvl_Level_t Scope,long Cod,const char *AltText,
Err_NotEnoughMemoryExit ();
if (asprintf (&Icon,"%s",HieIcon[Scope]) < 0)
Err_NotEnoughMemoryExit ();
Color = Ico_BLACK;
}
ClassNotEmpty = false;
if (Class)
if (Class[0])
ClassNotEmpty = true;
HTM_IMG (URL,Icon,AltText,
"class=\"ICO%ux%u%s%s\"",
"class=\"ICO%ux%u"
"%s%s"
"%s%s\"",
Size,Size,
Ico_ClassColor[Color][Gbl.Prefs.Theme][0] ? " " :
"",
Ico_ClassColor[Color][Gbl.Prefs.Theme],
ClassNotEmpty ? " " :
"",
ClassNotEmpty ? Class :

View File

@ -78,6 +78,7 @@
#include "swad_password.h"
#include "swad_photo.h"
#include "swad_privacy.h"
#include "swad_profile.h"
#include "swad_QR.h"
#include "swad_record.h"
#include "swad_record_database.h"
@ -249,6 +250,9 @@ static void Usr_DrawClassPhoto (Usr_ClassPhotoType_t ClassPhotoType,
struct SelectedUsrs *SelectedUsrs,
bool PutCheckBoxToSelectUsr);
static void Usr_GetAndShowNumUsrsInCrss (Rol_Role_t Role);
static void Usr_GetAndShowNumUsrsNotBelongingToAnyCrs (void);
/*****************************************************************************/
/**** Show alert about number of clicks remaining before sending my photo ****/
/*****************************************************************************/
@ -2150,6 +2154,7 @@ void Usr_WriteRowUsrMainData (unsigned NumUsr,struct UsrData *UsrDat,
bool PutCheckBoxToSelectUsr,Rol_Role_t Role,
struct SelectedUsrs *SelectedUsrs)
{
extern const char *The_Colors[The_NUM_THEMES];
extern const char *Txt_Enrolment_confirmed;
extern const char *Txt_Enrolment_not_confirmed;
static const char *ClassPhoto[PhoSha_NUM_SHAPES] =
@ -2184,16 +2189,18 @@ void Usr_WriteRowUsrMainData (unsigned NumUsr,struct UsrData *UsrDat,
/***** User has accepted enrolment? *****/
if (UsrIsTheMsgSender)
HTM_TD_Begin ("class=\"BM_SEL %s\" title=\"%s\"",
HTM_TD_Begin ("class=\"BM_SEL %s_%s\" title=\"%s\"",
UsrDat->Accepted ? "USR_LIST_NUM_N" :
"USR_LIST_NUM",
The_Colors[Gbl.Prefs.Theme],
UsrDat->Accepted ? Txt_Enrolment_confirmed :
Txt_Enrolment_not_confirmed);
else
HTM_TD_Begin ("class=\"BM%u %s\" title=\"%s\"",
Gbl.RowEvenOdd,
HTM_TD_Begin ("class=\"BM %s_%s %s\" title=\"%s\"",
UsrDat->Accepted ? "USR_LIST_NUM_N" :
"USR_LIST_NUM",
The_Colors[Gbl.Prefs.Theme],
BgColor,
UsrDat->Accepted ? Txt_Enrolment_confirmed :
Txt_Enrolment_not_confirmed);
HTM_Txt (UsrDat->Accepted ? "&check;" :
@ -2201,9 +2208,10 @@ void Usr_WriteRowUsrMainData (unsigned NumUsr,struct UsrData *UsrDat,
HTM_TD_End ();
/***** Write number of user in the list *****/
HTM_TD_Begin ("class=\"%s RM %s\"",
HTM_TD_Begin ("class=\"%s_%s RM %s\"",
UsrDat->Accepted ? "USR_LIST_NUM_N" :
"USR_LIST_NUM",
The_Colors[Gbl.Prefs.Theme],
BgColor);
HTM_Unsigned (NumUsr);
HTM_TD_End ();
@ -2635,12 +2643,15 @@ static void Usr_WriteUsrData (const char *BgColor,
const char *Data,const char *Link,
bool NonBreak,bool Accepted)
{
extern const char *The_Colors[The_NUM_THEMES];
/***** Begin table cell *****/
HTM_TD_Begin ("class=\"%s LM %s\"",
HTM_TD_Begin ("class=\"%s_%s LM %s\"",
Accepted ? (NonBreak ? "DAT_SMALL_NOBR_N" :
"DAT_SMALL_N") :
(NonBreak ? "DAT_SMALL_NOBR" :
"DAT_SMALL"),
The_Colors[Gbl.Prefs.Theme],
BgColor);
/***** Container to limit length *****/
@ -4767,7 +4778,7 @@ unsigned Usr_ListUsrsFound (Rol_Role_t Role,
/***** List data of users *****/
for (NumUsr = 0, Gbl.RowEvenOdd = 0;
NumUsr < NumUsrs;
NumUsr++)
NumUsr++, Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd)
{
UsrInList = &Gbl.Usrs.LstUsrs[Role].Lst[NumUsr];
@ -4806,8 +4817,6 @@ unsigned Usr_ListUsrsFound (Rol_Role_t Role,
HTM_TR_End ();
}
Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd;
}
/***** Free memory used for user's data *****/
@ -6533,3 +6542,210 @@ Usr_Who_t Usr_GetHiddenParamWho (void)
Usr_NUM_WHO - 1,
Usr_WHO_UNKNOWN);
}
/*****************************************************************************/
/********************** Show stats about number of users *********************/
/*****************************************************************************/
void Usr_GetAndShowUsersStats (void)
{
extern const char *Hlp_ANALYTICS_Figures_users;
extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES];
extern const char *Txt_Users;
extern const char *Txt_Number_of_users;
extern const char *Txt_Average_number_of_courses_to_which_a_user_belongs;
extern const char *Txt_Average_number_of_users_belonging_to_a_course;
/***** Begin box and table *****/
Box_BoxTableBegin (NULL,Txt_FIGURE_TYPES[Fig_USERS],
NULL,NULL,
Hlp_ANALYTICS_Figures_users,Box_NOT_CLOSABLE,2);
/***** Write heading *****/
HTM_TR_Begin (NULL);
HTM_TH (Txt_Users ,HTM_HEAD_RIGHT);
HTM_TH (Txt_Number_of_users ,HTM_HEAD_RIGHT);
HTM_TH (Txt_Average_number_of_courses_to_which_a_user_belongs,HTM_HEAD_RIGHT);
HTM_TH (Txt_Average_number_of_users_belonging_to_a_course ,HTM_HEAD_RIGHT);
HTM_TR_End ();
/***** Figures *****/
Usr_GetAndShowNumUsrsInCrss (Rol_STD); // Students
Usr_GetAndShowNumUsrsInCrss (Rol_NET); // Non-editing teachers
Usr_GetAndShowNumUsrsInCrss (Rol_TCH); // Teachers
Usr_GetAndShowNumUsrsInCrss (Rol_UNK); // Any user in courses
/***** Separator *****/
HTM_TR_Begin (NULL);
HTM_TH_Span (NULL,HTM_HEAD_CENTER,1,4,"SEPAR_ROW");
HTM_TR_End ();
Usr_GetAndShowNumUsrsNotBelongingToAnyCrs (); // Users not beloging to any course
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/**************** Get and show number of users in courses ********************/
/*****************************************************************************/
// Rol_UNK means any role in courses
static void Usr_GetAndShowNumUsrsInCrss (Rol_Role_t Role)
{
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *The_ClassDatStrong[The_NUM_THEMES];
extern const char *Txt_Total;
extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
long Cod = Sco_GetCurrentCod ();
char *Class;
unsigned Roles;
/***** Initializations depending on role *****/
if (Role == Rol_UNK)
{
if (asprintf (&Class,"RB %s LINE_TOP",The_ClassDatStrong[Gbl.Prefs.Theme]) < 0)
Err_NotEnoughMemoryExit ();
Roles = (1 << Rol_STD) |
(1 << Rol_NET) |
(1 << Rol_TCH);
}
else
{
if (asprintf (&Class,"RB %s",The_ClassDat[Gbl.Prefs.Theme]) < 0)
Err_NotEnoughMemoryExit ();
Roles = (1 << Role);
}
/***** Write the total number of users *****/
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Txt ((Role == Rol_UNK) ? Txt_Total :
Txt_ROLES_PLURAL_Abc[Role][Usr_SEX_UNKNOWN]);
HTM_TD_End ();
/* Number of users in courses */
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Unsigned (Enr_GetCachedNumUsrsInCrss (Gbl.Scope.Current,Cod,Roles));
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Double2Decimals (Enr_GetCachedAverageNumCrssPerUsr (Gbl.Scope.Current,Cod,Role));
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Double2Decimals (Enr_GetCachedAverageNumUsrsPerCrs (Gbl.Scope.Current,Cod,Role));
HTM_TD_End ();
HTM_TR_End ();
free (Class);
}
/*****************************************************************************/
/**************** Get and show number of users in courses ********************/
/*****************************************************************************/
static void Usr_GetAndShowNumUsrsNotBelongingToAnyCrs (void)
{
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
char *Class;
if (asprintf (&Class,"%s RB",The_ClassDat[Gbl.Prefs.Theme]) < 0)
Err_NotEnoughMemoryExit ();
/***** Write the total number of users not belonging to any course *****/
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Txt (Txt_ROLES_PLURAL_Abc[Rol_GST][Usr_SEX_UNKNOWN]);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Unsigned (Enr_GetCachedNumUsrsNotBelongingToAnyCrs ());
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Double2Decimals (0.0);
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s\"",Class);
HTM_Double2Decimals (0.0);
HTM_TD_End ();
HTM_TR_End ();
free (Class);
}
/*****************************************************************************/
/****************************** Show users' ranking **************************/
/*****************************************************************************/
void Usr_GetAndShowUsersRanking (void)
{
extern const char *Hlp_ANALYTICS_Figures_ranking;
extern const char *The_ClassDat[The_NUM_THEMES];
extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES];
extern const char *Txt_Clicks;
extern const char *Txt_Clicks_per_day;
extern const char *Txt_Timeline;
extern const char *Txt_Downloads;
extern const char *Txt_Forums;
extern const char *Txt_Messages;
extern const char *Txt_Followers;
/***** Begin box and table *****/
Box_BoxTableBegin (NULL,Txt_FIGURE_TYPES[Fig_USERS_RANKING],
NULL,NULL,
Hlp_ANALYTICS_Figures_ranking,Box_NOT_CLOSABLE,2);
/***** Write heading *****/
HTM_TR_Begin (NULL);
HTM_TH (Txt_Clicks ,HTM_HEAD_CENTER);
HTM_TH (Txt_Clicks_per_day,HTM_HEAD_CENTER);
HTM_TH (Txt_Timeline ,HTM_HEAD_CENTER);
HTM_TH (Txt_Followers ,HTM_HEAD_CENTER);
HTM_TH (Txt_Downloads ,HTM_HEAD_CENTER);
HTM_TH (Txt_Forums ,HTM_HEAD_CENTER);
HTM_TH (Txt_Messages ,HTM_HEAD_CENTER);
HTM_TR_End ();
/***** Rankings *****/
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"%s LT\"",The_ClassDat[Gbl.Prefs.Theme]);
Prf_GetAndShowRankingClicks ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LT\"",The_ClassDat[Gbl.Prefs.Theme]);
Prf_GetAndShowRankingClicksPerDay ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LT\"",The_ClassDat[Gbl.Prefs.Theme]);
Prf_GetAndShowRankingTimelinePubs ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LT\"",The_ClassDat[Gbl.Prefs.Theme]);
Fol_GetAndShowRankingFollowers ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LT\"",The_ClassDat[Gbl.Prefs.Theme]);
Prf_GetAndShowRankingFileViews ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LT\"",The_ClassDat[Gbl.Prefs.Theme]);
Prf_GetAndShowRankingForPsts ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"%s LT\"",The_ClassDat[Gbl.Prefs.Theme]);
Prf_GetAndShowRankingMsgsSnt ();
HTM_TD_End ();
HTM_TR_End ();
/***** End table and box *****/
Box_BoxTableEnd ();
}

View File

@ -440,4 +440,8 @@ void Usr_PutWhoIcon (Usr_Who_t Who);
void Usr_PutHiddenParamWho (Usr_Who_t Who);
Usr_Who_t Usr_GetHiddenParamWho (void);
//-------------------------------- Figures ------------------------------------
void Usr_GetAndShowUsersStats (void);
void Usr_GetAndShowUsersRanking (void);
#endif