diff --git a/swad_MFU.c b/swad_MFU.c index e8fa1184..ef3292c3 100644 --- a/swad_MFU.c +++ b/swad_MFU.c @@ -187,7 +187,6 @@ void MFU_WriteBigMFUActions (struct MFU_ListMFUActions *ListMFUActions) { extern const char *Hlp_ANALYTICS_Frequent; extern const char *Txt_My_frequent_actions; - extern const char *Txt_TABS_TXT[Tab_NUM_TABS]; unsigned NumAct; Act_Action_t Action; const char *Title; @@ -214,7 +213,7 @@ void MFU_WriteBigMFUActions (struct MFU_ListMFUActions *ListMFUActions) if ((Title = Act_GetTitleAction (Action)) != NULL) { /* Action string */ - Str_Copy (TabStr,Txt_TABS_TXT[Act_GetTab (Act_GetSuperAction (Action))], + Str_Copy (TabStr,Tab_GetTxt (Act_GetTab (Act_GetSuperAction (Action))), sizeof (TabStr) - 1); Str_Copy (MenuStr,Title,sizeof (MenuStr) - 1); snprintf (TabMenuStr,sizeof (TabMenuStr),"%s > %s",TabStr,MenuStr); @@ -249,7 +248,6 @@ void MFU_WriteBigMFUActions (struct MFU_ListMFUActions *ListMFUActions) void MFU_WriteSmallMFUActions (struct MFU_ListMFUActions *ListMFUActions) { extern const char *Txt_Frequent_ACTIONS; - extern const char *Txt_TABS_TXT[Tab_NUM_TABS]; unsigned NumAct; Act_Action_t Action; const char *Title; @@ -273,7 +271,7 @@ void MFU_WriteSmallMFUActions (struct MFU_ListMFUActions *ListMFUActions) if ((Title = Act_GetTitleAction (Action)) != NULL) { /* Action string */ - Str_Copy (TabStr,Txt_TABS_TXT[Act_GetTab (Act_GetSuperAction (Action))], + Str_Copy (TabStr,Tab_GetTxt (Act_GetTab (Act_GetSuperAction (Action))), sizeof (TabStr) - 1); Str_Copy (MenuStr,Title,sizeof (MenuStr) - 1); snprintf (TabMenuStr,sizeof (TabMenuStr),"%s > %s",TabStr,MenuStr); diff --git a/swad_action_list.c b/swad_action_list.c index 3ef46379..832f3b26 100644 --- a/swad_action_list.c +++ b/swad_action_list.c @@ -1805,7 +1805,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] = [ActSeeAccCrs ] = { 119,-1,TabUnk,ActReqAccGbl ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Sta_SeeCrsAccesses ,NULL}, [ActLstClk ] = { 989,-1,TabUnk,ActReqAccGbl ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Log_ShowLastClicks ,NULL}, - [ActRefLstClk ] = { 994,-1,TabUnk,ActRefLstClk ,0x3F8,0x3C7,0x3C7,0x3C7,0x3C7,0x3C7,0x3C7,Act_CONT_NORM,Act_AJAX_RFRESH,NULL ,Lay_RefreshLastClicks ,NULL}, + [ActRefLstClk ] = { 994,-1,TabUnk,ActReqAccGbl ,0x3F8,0x3C7,0x3C7,0x3C7,0x3C7,0x3C7,0x3C7,Act_CONT_NORM,Act_AJAX_RFRESH,NULL ,Lay_RefreshLastClicks ,NULL}, [ActSeeMyUsgRep ] = {1582,-1,TabUnk,ActReqMyUsgRep ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Rep_ShowMyUsageReport ,NULL}, diff --git a/swad_changelog.h b/swad_changelog.h index 180183d3..abb7095a 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -633,10 +633,11 @@ Me sale este error, no s "can npt create received message (duplicated entry '243218-2160773' for key 'UsrCod_MsgCod') */ -#define Log_PLATFORM_VERSION "SWAD 23.67.2 (2024-03-09)" +#define Log_PLATFORM_VERSION "SWAD 23.67.3 (2024-03-09)" #define CSS_FILE "swad23.67.2.css" #define JS_FILE "swad23.53.6.js" /* + Version 23.67.3: Mar 09, 2024 Changes in global hits. (335454 lines) Version 23.67.2: Mar 09, 2024 Changes in layout. Fixed missing texts in actions. (335424 lines) Version 23.67.1: Mar 08, 2024 Fixed issue in layout. (335308 lines) Version 23.67: Mar 08, 2024 Fixed bug in selection of groups related to attendance. Reported by Antonio Manuel Fernández Pérez. diff --git a/swad_mail.c b/swad_mail.c index d9df9c1d..1a944254 100644 --- a/swad_mail.c +++ b/swad_mail.c @@ -347,16 +347,15 @@ static void Mai_GetMailDomain (const char *Email, void Mai_WriteWarningEmailNotifications (void) { extern const char *Txt_You_can_only_receive_email_notifications_if_; - extern const char *Txt_TABS_TXT[Tab_NUM_TABS]; extern const char *Txt_MENU_TITLE[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB]; extern const char *Txt_Domains; - Tab_Tab_t TabMyAccount = Act_GetTab (ActFrmMyAcc ); + Tab_Tab_t TabMyAccount = Act_GetTab (ActFrmMyAcc); Tab_Tab_t TabMailDomains = Act_GetTab (ActSeeMai); Ale_ShowAlert (Ale_WARNING,Txt_You_can_only_receive_email_notifications_if_, - Txt_TABS_TXT [TabMyAccount ], + Tab_GetTxt (TabMyAccount), Txt_MENU_TITLE[TabMyAccount ][Act_GetIndexInMenu (ActFrmMyAcc)], - Txt_TABS_TXT [TabMailDomains], + Tab_GetTxt (TabMailDomains), Txt_MENU_TITLE[TabMailDomains][Act_GetIndexInMenu (ActSeeMai )], Txt_Domains); } diff --git a/swad_report.c b/swad_report.c index 71e3981f..2dc61865 100644 --- a/swad_report.c +++ b/swad_report.c @@ -711,7 +711,6 @@ static void Rep_WriteSectionGlobalHits (struct Rep_Report *Report) static void Rep_WriteSectionHitsPerAction (struct Rep_Report *Report) { extern const char *Txt_Hits_per_action; - extern const char *Txt_TABS_TXT[Tab_NUM_TABS]; extern const char *Txt_Other_actions; MYSQL_RES *mysql_res; MYSQL_ROW row; @@ -719,7 +718,7 @@ static void Rep_WriteSectionHitsPerAction (struct Rep_Report *Report) unsigned NumHit; long ActCod; Act_Action_t Action; - Tab_Tab_t Tab; + const char *TabTxt; unsigned long NumClicks; /***** Begin section *****/ @@ -760,9 +759,9 @@ static void Rep_WriteSectionHitsPerAction (struct Rep_Report *Report) { if ((Action = Act_GetActionFromActCod (ActCod)) >= 0) { - Tab = Act_GetTab (Act_GetSuperAction (Action)); - if (Txt_TABS_TXT[Tab]) - fprintf (Rep_File,"%s > ",Txt_TABS_TXT[Tab]); + TabTxt = Tab_GetTxt (Act_GetTab (Act_GetSuperAction (Action))); + if (TabTxt) + fprintf (Rep_File,"%s > ",TabTxt); } fprintf (Rep_File,"%s",Act_GetActionText (Action)); diff --git a/swad_statistic.c b/swad_statistic.c index c9a10fc6..5b91d236 100644 --- a/swad_statistic.c +++ b/swad_statistic.c @@ -103,8 +103,10 @@ static const unsigned Sta_CellPadding[Sta_NUM_CLICKS_GROUPED_BY] = static void Sta_PutFormCrsHits (struct Sta_Stats *Stats); static void Sta_PutFormGblHits (struct Sta_Stats *Stats); -static void Sta_WriteSelectorCountType (const struct Sta_Stats *Stats); +static void Sta_WriteSelectorRoles (const struct Sta_Stats *Stats); static void Sta_WriteSelectorAction (const struct Sta_Stats *Stats); +static void Sta_WriteSelectorScope (void); +static void Sta_WriteSelectorCountType (const struct Sta_Stats *Stats); static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse); static void Sta_ShowDetailedAccessesList (const struct Sta_Stats *Stats, unsigned NumHits, @@ -471,9 +473,6 @@ static void Sta_PutFormGblHits (struct Sta_Stats *Stats) { extern const char *Hlp_ANALYTICS_Visits_global_visits; extern const char *Txt_Statistics_of_all_visits; - extern const char *Txt_Users; - extern const char *Txt_ROLE_STATS[Sta_NUM_ROLES_STAT]; - extern const char *Txt_Scope; extern const char *Txt_Show; extern const char *Txt_distributed_by; extern const char *Txt_STAT_CLICKS_GROUPED_BY[Sta_NUM_CLICKS_GROUPED_BY]; @@ -483,8 +482,6 @@ static void Sta_PutFormGblHits (struct Sta_Stats *Stats) [Dat_STR_TIME] = Dat_HMS_TO_000000, [Dat_END_TIME] = Dat_HMS_TO_235959 }; - Sta_Role_t RoleStat; - unsigned RoleStatUnsigned; Sta_ClicksGroupedBy_t ClicksGroupedBy; unsigned ClicksGroupedByUnsigned; @@ -505,55 +502,13 @@ static void Sta_PutFormGblHits (struct Sta_Stats *Stats) Dat_PutFormStartEndClientLocalDateTimesWithYesterdayToday (SetHMS); /***** Users' roles whose accesses we want to see *****/ - HTM_TR_Begin (NULL); - - /* Label */ - Frm_LabelColumn ("Frm_C1 RT","Role",Txt_Users); - - /* Data */ - HTM_TD_Begin ("class=\"Frm_C2 LT\""); - HTM_SELECT_Begin (HTM_DONT_SUBMIT_ON_CHANGE,NULL, - "id=\"Role\" name=\"Role\"" - " class=\"Frm_C2_INPUT INPUT_%s\"", - The_GetSuffix ()); - for (RoleStat = (Sta_Role_t) 0; - RoleStat <= (Sta_Role_t) (Sta_NUM_ROLES_STAT - 1); - RoleStat++) - { - RoleStatUnsigned = (unsigned) RoleStat; - HTM_OPTION (HTM_Type_UNSIGNED,&RoleStatUnsigned, - RoleStat == Stats->Role ? HTM_OPTION_SELECTED : - HTM_OPTION_UNSELECTED, - HTM_OPTION_ENABLED, - "%s",Txt_ROLE_STATS[RoleStat]); - } - HTM_SELECT_End (); - HTM_TD_End (); - - HTM_TR_End (); + Sta_WriteSelectorRoles (Stats); /***** Selection of action *****/ Sta_WriteSelectorAction (Stats); /***** Clicks made from anywhere, current center, current degree or current course *****/ - HTM_TR_Begin (NULL); - - /* Label */ - Frm_LabelColumn ("Frm_C1 RT","ScopeSta",Txt_Scope); - - /* Data */ - HTM_TD_Begin ("class=\"Frm_C2 LT\""); - Gbl.Scope.Allowed = 1 << Hie_SYS | - 1 << Hie_CTY | - 1 << Hie_INS | - 1 << Hie_CTR | - 1 << Hie_DEG | - 1 << Hie_CRS; - Sco_GetScope ("ScopeSta",Hie_SYS); - Sco_PutSelectorScope ("ScopeSta",HTM_DONT_SUBMIT_ON_CHANGE); - HTM_TD_End (); - - HTM_TR_End (); + Sta_WriteSelectorScope (); /***** Count type for the statistic *****/ HTM_TR_Begin (NULL); @@ -647,6 +602,130 @@ void Sta_PutLinkToGlobalHits (void) Txt_Global_visits,NULL); } +/*****************************************************************************/ +/******* Put selectors for users' roles whose accesses we want to see ********/ +/*****************************************************************************/ + +static void Sta_WriteSelectorRoles (const struct Sta_Stats *Stats) + { + extern const char *Txt_Users; + extern const char *Txt_ROLE_STATS[Sta_NUM_ROLES_STAT]; + Sta_Role_t RoleStat; + unsigned RoleStatUnsigned; + + HTM_TR_Begin (NULL); + + /* Label */ + Frm_LabelColumn ("Frm_C1 RT","Role",Txt_Users); + + /* Data */ + HTM_TD_Begin ("class=\"Frm_C2 LT\""); + HTM_SELECT_Begin (HTM_DONT_SUBMIT_ON_CHANGE,NULL, + "id=\"Role\" name=\"Role\"" + " class=\"Frm_C2_INPUT INPUT_%s\"", + The_GetSuffix ()); + for (RoleStat = (Sta_Role_t) 0; + RoleStat <= (Sta_Role_t) (Sta_NUM_ROLES_STAT - 1); + RoleStat++) + { + RoleStatUnsigned = (unsigned) RoleStat; + HTM_OPTION (HTM_Type_UNSIGNED,&RoleStatUnsigned, + RoleStat == Stats->Role ? HTM_OPTION_SELECTED : + HTM_OPTION_UNSELECTED, + HTM_OPTION_ENABLED, + "%s",Txt_ROLE_STATS[RoleStat]); + } + HTM_SELECT_End (); + HTM_TD_End (); + + HTM_TR_End (); + } + +/*****************************************************************************/ +/******************** Put selector for type of action ************************/ +/*****************************************************************************/ + +static void Sta_WriteSelectorAction (const struct Sta_Stats *Stats) + { + extern const char *Txt_Action; + extern const char *Txt_Any_action; + Act_Action_t Action; + Tab_Tab_t Tab; + unsigned ActionUnsigned; + + /***** Action *****/ + HTM_TR_Begin (NULL); + + /* Label */ + Frm_LabelColumn ("Frm_C1 RT","StatAct",Txt_Action); + + HTM_TD_Begin ("class=\"Frm_C2 LT\""); + HTM_SELECT_Begin (HTM_DONT_SUBMIT_ON_CHANGE,NULL, + "id=\"StatAct\" name=\"StatAct\"" + " class=\"Frm_C2_INPUT INPUT_%s\"", + The_GetSuffix ()); + HTM_OPTION (HTM_Type_STRING,"0", + Stats->NumAction == 0 ? HTM_OPTION_SELECTED : + HTM_OPTION_UNSELECTED, + HTM_OPTION_ENABLED, + "%s",Txt_Any_action); + for (Action = (Act_Action_t) 1; + Action <= (Act_Action_t) (ActLst_NUM_ACTIONS - 1); + Action++) + { + ActionUnsigned = (unsigned) Action; + Tab = Act_GetTab (Action); + if (Tab == TabUnk) + HTM_OPTION (HTM_Type_UNSIGNED,&ActionUnsigned, + Action == Stats->NumAction ? HTM_OPTION_SELECTED : + HTM_OPTION_UNSELECTED, + HTM_OPTION_ENABLED, + "%u: %s", + (unsigned) Action,Act_GetActionText (Action)); + else + HTM_OPTION (HTM_Type_UNSIGNED,&ActionUnsigned, + Action == Stats->NumAction ? HTM_OPTION_SELECTED : + HTM_OPTION_UNSELECTED, + HTM_OPTION_ENABLED, + "%u: %s > %s > %s", + (unsigned) Action,Tab_GetTxt (Tab), + Act_GetTitleAction (Action), + Act_GetActionText (Action)); + } + HTM_SELECT_End (); + HTM_TD_End (); + + HTM_TR_End (); + } + +/*****************************************************************************/ +/************************* Put selector for scope ****************************/ +/*****************************************************************************/ + +static void Sta_WriteSelectorScope (void) + { + extern const char *Txt_Scope; + + HTM_TR_Begin (NULL); + + /* Label */ + Frm_LabelColumn ("Frm_C1 RT","ScopeSta",Txt_Scope); + + /* Data */ + HTM_TD_Begin ("class=\"Frm_C2 LT\""); + Gbl.Scope.Allowed = 1 << Hie_SYS | + 1 << Hie_CTY | + 1 << Hie_INS | + 1 << Hie_CTR | + 1 << Hie_DEG | + 1 << Hie_CRS; + Sco_GetScope ("ScopeSta",Hie_SYS); + Sco_PutSelectorScope ("ScopeSta",HTM_DONT_SUBMIT_ON_CHANGE); + HTM_TD_End (); + + HTM_TR_End (); + } + /*****************************************************************************/ /****** Put selectors for type of access count and for degree or course ******/ /*****************************************************************************/ @@ -676,54 +755,6 @@ static void Sta_WriteSelectorCountType (const struct Sta_Stats *Stats) HTM_SELECT_End (); } -/*****************************************************************************/ -/******************** Put selector for type of action ************************/ -/*****************************************************************************/ - -static void Sta_WriteSelectorAction (const struct Sta_Stats *Stats) - { - extern const char *Txt_Action; - extern const char *Txt_Any_action; - extern const char *Txt_TABS_TXT[Tab_NUM_TABS]; - Act_Action_t Action; - unsigned ActionUnsigned; - Tab_Tab_t Tab; - - /***** Action *****/ - HTM_TR_Begin (NULL); - - /* Label */ - Frm_LabelColumn ("Frm_C1 RT","StatAct",Txt_Action); - - HTM_TD_Begin ("class=\"Frm_C2 LT\""); - HTM_SELECT_Begin (HTM_DONT_SUBMIT_ON_CHANGE,NULL, - "id=\"StatAct\" name=\"StatAct\"" - " class=\"Frm_C2_INPUT INPUT_%s\"", - The_GetSuffix ()); - HTM_OPTION (HTM_Type_STRING,"0", - Stats->NumAction == 0 ? HTM_OPTION_SELECTED : - HTM_OPTION_UNSELECTED, - HTM_OPTION_ENABLED, - "%s",Txt_Any_action); - for (Action = (Act_Action_t) 1; - Action <= (Act_Action_t) (ActLst_NUM_ACTIONS - 1); - Action++) - { - Tab = Act_GetTab (Act_GetSuperAction (Action)); - ActionUnsigned = (unsigned) Action; - HTM_OPTION (HTM_Type_UNSIGNED,&ActionUnsigned, - Action == Stats->NumAction ? HTM_OPTION_SELECTED : - HTM_OPTION_UNSELECTED, - HTM_OPTION_ENABLED, - "%u: %s > %s", - (unsigned) Action,Txt_TABS_TXT[Tab],Act_GetActionText (Action)); - } - HTM_SELECT_End (); - HTM_TD_End (); - - HTM_TR_End (); - } - /*****************************************************************************/ /******************** Compute and show access statistics *********************/ /*****************************************************************************/ diff --git a/swad_tab.c b/swad_tab.c index 037915e7..7f18b4ff 100644 --- a/swad_tab.c +++ b/swad_tab.c @@ -53,9 +53,8 @@ static const char *Tab_GetIcon (Tab_Tab_t Tab); void Tab_DrawTabs (void) { extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS]; - extern const char *Txt_TABS_TXT[Tab_NUM_TABS]; - extern const char *Txt_TABS_TXT[Tab_NUM_TABS]; Tab_Tab_t NumTab; + const char *TabTxt; bool ICanViewTab; char URLIconSet[PATH_MAX + 1]; static const char *ClassIcoTab[Ico_NUM_ICON_SETS] = @@ -85,6 +84,8 @@ void Tab_DrawTabs (void) if (ICanViewTab) // Don't show the first hidden tabs { + TabTxt = Tab_GetTxt (NumTab); + /* Form, icon (at top) and text (at bottom) of the tab */ HTM_LI_Begin ("class=\"%s%s\"", NumTab == Gbl.Action.Tab ? "TAB_ON TAB_ON_" : @@ -98,22 +99,21 @@ void Tab_DrawTabs (void) Frm_BeginForm (ActMnu); Par_PutParUnsigned (NULL,"NxtTab",(unsigned) NumTab); - HTM_BUTTON_Submit_Begin (Txt_TABS_TXT[NumTab], - "class=\"BT_LINK\""); + HTM_BUTTON_Submit_Begin (TabTxt,"class=\"BT_LINK\""); snprintf (URLIconSet,sizeof (URLIconSet),"%s/%s", Cfg_URL_ICON_SETS_PUBLIC,Ico_IconSetId[Gbl.Prefs.IconSet]); if (ClassIcoTab[Gbl.Prefs.IconSet]) - HTM_IMG (URLIconSet,Tab_GetIcon (NumTab),Txt_TABS_TXT[NumTab], + HTM_IMG (URLIconSet,Tab_GetIcon (NumTab),TabTxt, "class=\"TAB_ICO %s_%s\"", ClassIcoTab[Gbl.Prefs.IconSet],The_GetSuffix ()); else - HTM_IMG (URLIconSet,Tab_GetIcon (NumTab),Txt_TABS_TXT[NumTab], + HTM_IMG (URLIconSet,Tab_GetIcon (NumTab),TabTxt, "class=\"TAB_ICO\""); HTM_DIV_Begin ("class=\"TAB_TXT TAB_%s_TXT_%s\"", NumTab == Gbl.Action.Tab ? "ON" : "OFF", The_GetSuffix ()); - HTM_Txt (Txt_TABS_TXT[NumTab]); + HTM_Txt (TabTxt); HTM_DIV_End (); HTM_BUTTON_End (); Frm_EndForm (); @@ -163,7 +163,7 @@ static bool Tab_CheckIfICanViewTab (Tab_Tab_t Tab) } /*****************************************************************************/ -/********************** Get icon associated to an action *********************/ +/************************ Get icon associated to a tab ***********************/ /*****************************************************************************/ static const char *Tab_GetIcon (Tab_Tab_t NumTab) @@ -193,6 +193,17 @@ static const char *Tab_GetIcon (Tab_Tab_t NumTab) return Ico_GetIcon (Tab_TabIcons[NumTab]); } +/*****************************************************************************/ +/************************ Get text associated to a tab ***********************/ +/*****************************************************************************/ + +const char *Tab_GetTxt (Tab_Tab_t NumTab) + { + extern const char *Txt_TABS_TXT[Tab_NUM_TABS]; + + return Txt_TABS_TXT[NumTab]; + } + /*****************************************************************************/ /*************** Set current tab depending on current action *****************/ /*****************************************************************************/ diff --git a/swad_tab.h b/swad_tab.h index 51839025..5a713559 100644 --- a/swad_tab.h +++ b/swad_tab.h @@ -57,6 +57,8 @@ typedef enum void Tab_DrawTabs (void); +const char *Tab_GetTxt (Tab_Tab_t NumTab); + void Tab_SetCurrentTab (void); void Tab_DisableIncompatibleTabs (void); diff --git a/swad_text_action.c b/swad_text_action.c index 2040d8e5..137b1219 100644 --- a/swad_text_action.c +++ b/swad_text_action.c @@ -33420,11 +33420,11 @@ const char *Txt_Actions[ActLst_NUM_ACTIONS] = #elif L==3 // en "Refresh the last clicks in real time" #elif L==4 // es - "Refrescar los &ucute;ltimos clics en tiempo real" + "Refrescar los últimos clics en tiempo real" #elif L==5 // fr "Refresh the last clicks in real time" // Besoin de traduction #elif L==6 // gn - "Refrescar los &ucute;ltimos clics en tiempo real" // Okoteve traducción + "Refrescar los últimos clics en tiempo real" // Okoteve traducción #elif L==7 // it "Refresh the last clicks in real time" // Bisogno di traduzione #elif L==8 // pl