diff --git a/swad_changelog.h b/swad_changelog.h index c3fb006b..6f01de88 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -432,8 +432,6 @@ Lo de mutear anuncios, en principio prefiero hacer una opci // TODO: Intentar aumentar la velocidad de carga del timeline (comprobar ralentización al mostrar la titulación de cada usuario) -// TODO: "Se podría poner un botón para seguir a todos los relacionados contigo en las asignaturas, en lugar de tener que agregarlos uno a uno" Suggested by José María girao Miras. - /*****************************************************************************/ /****************************** Public constants *****************************/ /*****************************************************************************/ @@ -453,14 +451,15 @@ En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 18.73 (2019-03-12)" +#define Log_PLATFORM_VERSION "SWAD 18.73.1 (2019-03-12)" #define CSS_FILE "swad18.68.3.css" #define JS_FILE "swad18.64.js" /* -Arreglar BUG: RMS no debería poder seleccionar todos los grupos al redactar mensajes -Arreglar BUG: A RMS le sale ACV al listar profesores, pero no al redactar mensajes +Arreglar BUG: RMS no debería poder seleccionar todos los grupos al redactar mensajes !!!!!!!!!!! +Arreglar BUG: A RMS le sale ACV al listar profesores, pero no al redactar mensajes !!!!!!!!!!! - Version 18.73: Mar 12, 2019 New actions to follow/unfollow several users. (239658 lines) + Version 18.73.1: Mar 12, 2019 Code refactoring in list of options when listing several users. (239569 lines) + Version 18.73: Mar 12, 2019 New actions to follow/unfollow several users. Suggested by José María Guirao Miras. (239658 lines) 14 changes necessary in database: UPDATE actions SET Txt='Ver fichas profesores' WHERE ActCod='22' AND Language='es'; UPDATE actions SET Txt='Ver fichas estudiantes' WHERE ActCod='89' AND Language='es'; @@ -481,11 +480,6 @@ INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1763','es','N','Deja Version 18.72.1: Mar 11, 2019 Show attendance list from list of users. (239075 lines) Version 18.72: Mar 11, 2019 Show homework from list of students and teachers. (239043 lines) Version 18.71: Mar 11, 2019 Listing of users now allow to do several actions. Not finished. (238920 lines) - 3 changes necessary in database: -UPDATE actions SET Txt='Realizar acción con varios profesores' WHERE ActCod='22' AND Language='es'; -UPDATE actions SET Txt='Realizar acción con varios estudiantes' WHERE ActCod='89' AND Language='es'; -UPDATE actions SET Txt='Realizar acción con varios invitados' WHERE ActCod='1187' AND Language='es'; - Version 18.70: Mar 10, 2019 Code refactoring in one user administration. (238819 lines) Version 18.69.2: Mar 10, 2019 Changes related to alerts. (238842 lines) Version 18.69.1: Mar 09, 2019 Changes in forms to register/remove users. (238805 lines) diff --git a/swad_global.c b/swad_global.c index a0d3dec5..2b2eb232 100644 --- a/swad_global.c +++ b/swad_global.c @@ -196,7 +196,7 @@ void Gbl_InitializeGlobals (void) Gbl.Action.Tab = TabUnk; Gbl.Usrs.Selected.Filled = false; // Lists of encrypted codes of users selected from form are not filled - Gbl.Usrs.Selected.Action = Usr_LIST_USRS_UNKNOWN_ACTION; + Gbl.Usrs.Selected.Option = Usr_OPTION_UNKNOWN; for (Role = (Rol_Role_t) 0; Role < Rol_NUM_ROLES; Role++) diff --git a/swad_global.h b/swad_global.h index 34f04a33..b6d2c373 100644 --- a/swad_global.h +++ b/swad_global.h @@ -397,7 +397,7 @@ struct Globals { char *List[Rol_NUM_ROLES]; // Lists of encrypted codes of users selected from a form bool Filled; // If lists are already filled/readed - Usr_ListUsrsAction_t Action; // What action I want to do with these selected users + Usr_ListUsrsOption_t Option; // What option I have selected to do with these selected users } Selected; char *ListOtherRecipients; // List of ID or nicks of users written explicitely on a form struct diff --git a/swad_text.c b/swad_text.c index 8d34ef7a..442230be 100644 --- a/swad_text.c +++ b/swad_text.c @@ -54999,11 +54999,11 @@ const char *Txt_You_have_stopped_following_X_users = // Warning: it is very impo #elif L==3 // en "You have stopped following %u users."; #elif L==4 // es - "Ha seguido a %u usuarios."; + "Ha dejado de seguir a %u usuarios."; #elif L==5 // fr "Vous avez cessé de suivre %u utilisateurs."; #elif L==6 // gn - "Ha seguido a %u usuarios."; // Okoteve traducción + "Ha dejado de seguir a %u usuarios."; // Okoteve traducción #elif L==7 // it "Hai smesso di seguire %u utenti."; #elif L==8 // pl diff --git a/swad_user.c b/swad_user.c index 1f725b8e..5d62082a 100644 --- a/swad_user.c +++ b/swad_user.c @@ -237,15 +237,9 @@ static void Usr_PutLinkToSeeAdmins (void); static void Usr_PutLinkToSeeGuests (void); static bool Usr_PutActionsSeveralUsrs (Rol_Role_t UsrsRole); -static void Usr_PutActionShowRecords (void); -static void Usr_PutActionShowHomework (void); -static void Usr_PutActionShowAttendance (void); -static void Usr_PutActionNewMessage (void); -static void Usr_PutActionFollowUsers (void); -static void Usr_PutActionUnfollowUsers (void); -static void Usr_StartListUsrsAction (Usr_ListUsrsAction_t ListUsrsAction); -static void Usr_EndListUsrsAction (void); -static Usr_ListUsrsAction_t Usr_ListUsrsAction (Usr_ListUsrsAction_t DefaultAction); +static void Usr_ShowOneListUsrsOption (Usr_ListUsrsOption_t ListUsrsAction, + const char *Label); +static Usr_ListUsrsOption_t Usr_GetListUsrsOption (Usr_ListUsrsOption_t DefaultAction); static void Usr_PutIconsListGsts (void); static void Usr_PutIconsListStds (void); @@ -8023,215 +8017,112 @@ void Usr_SeeTeachers (void) static bool Usr_PutActionsSeveralUsrs (Rol_Role_t UsrsRole) { extern const char *The_ClassFormInBox[The_NUM_THEMES]; - bool ICanViewRecords; - bool ICanViewHomework; - bool ICanViewAttendance; - bool ICanSendMessage; - bool ICanFollow; - bool ICanUnfollow; - bool OptionsShown = false; + extern const char *Txt_Show_records; + extern const char *Txt_View_homework; + extern const char *Txt_Show_attendance; + extern const char *Txt_Send_message; + extern const char *Txt_Follow; + extern const char *Txt_Unfollow; + const char *Label[Usr_LIST_USRS_NUM_OPTIONS] = + { + NULL, // Usr_OPTION_UNKNOWN + Txt_Show_records, // Usr_OPTION_RECORDS + Txt_View_homework, // Usr_OPTION_HOMEWORK + Txt_Show_attendance, // Usr_OPTION_ATTENDANCE + Txt_Send_message, // Usr_OPTION_MESSAGE + Txt_Follow, // Usr_OPTION_FOLLOW + Txt_Unfollow, // Usr_OPTION_UNFOLLOW + }; + bool ICanChooseOption[Usr_LIST_USRS_NUM_OPTIONS]; + Usr_ListUsrsOption_t Opt; + bool OptionsShown; - /***** Get the action to do *****/ - Gbl.Usrs.Selected.Action = Usr_ListUsrsAction (Usr_LIST_USRS_DEFAULT_ACTION); + /***** Get the selected option from form *****/ + Gbl.Usrs.Selected.Option = Usr_GetListUsrsOption (Usr_LIST_USRS_DEFAULT_OPTION); + /***** Check which options I can choose *****/ + /* Set default (I can not choose options) */ + for (Opt = (Usr_ListUsrsOption_t) 1; // Skip unknown option + Opt <= (Usr_ListUsrsOption_t) (Usr_LIST_USRS_NUM_OPTIONS - 1); + Opt++) + ICanChooseOption[Opt] = false; + + /* Activate some options depending on users' role, on my role, etc. */ switch (UsrsRole) { case Rol_GST: - ICanViewRecords = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); - - ICanViewHomework = - ICanViewAttendance = - ICanSendMessage = - ICanFollow = - ICanUnfollow = false; + ICanChooseOption[Usr_OPTION_RECORDS] = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); break; case Rol_STD: - ICanViewRecords = - ICanSendMessage = - ICanFollow = (Gbl.Scope.Current == Sco_SCOPE_CRS && - (Gbl.Usrs.Me.IBelongToCurrentCrs || - Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)); + ICanChooseOption[Usr_OPTION_RECORDS] = + ICanChooseOption[Usr_OPTION_MESSAGE] = + ICanChooseOption[Usr_OPTION_FOLLOW] = (Gbl.Scope.Current == Sco_SCOPE_CRS && + (Gbl.Usrs.Me.IBelongToCurrentCrs || + Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)); - ICanViewHomework = - ICanViewAttendance = (Gbl.Usrs.Me.Role.Logged == Rol_NET || - Gbl.Usrs.Me.Role.Logged == Rol_TCH || - Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); - ICanUnfollow = true; + ICanChooseOption[Usr_OPTION_HOMEWORK] = + ICanChooseOption[Usr_OPTION_ATTENDANCE] = (Gbl.Usrs.Me.Role.Logged == Rol_NET || + Gbl.Usrs.Me.Role.Logged == Rol_TCH || + Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); + ICanChooseOption[Usr_OPTION_UNFOLLOW] = true; break; case Rol_TCH: - ICanViewRecords = - ICanSendMessage = - ICanFollow = (Gbl.Scope.Current == Sco_SCOPE_CRS); + ICanChooseOption[Usr_OPTION_RECORDS] = + ICanChooseOption[Usr_OPTION_MESSAGE] = + ICanChooseOption[Usr_OPTION_FOLLOW] = (Gbl.Scope.Current == Sco_SCOPE_CRS); - ICanViewHomework = (Gbl.Usrs.Me.Role.Logged == Rol_NET || - Gbl.Usrs.Me.Role.Logged == Rol_TCH || - Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); - - ICanViewAttendance = false; - ICanUnfollow = true; + ICanChooseOption[Usr_OPTION_HOMEWORK] = (Gbl.Usrs.Me.Role.Logged == Rol_NET || + Gbl.Usrs.Me.Role.Logged == Rol_TCH || + Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); + ICanChooseOption[Usr_OPTION_UNFOLLOW] = true; break; default: - ICanViewRecords = - ICanViewHomework = - ICanViewAttendance = - ICanSendMessage = - ICanFollow = - ICanUnfollow = false; - break; + return false; } - /***** Start list of options *****/ + /***** Write list of options *****/ + /* Start list of options */ fprintf (Gbl.F.Out,""); return OptionsShown; } -/*****************************************************************************/ -/******************** Put action to show users' records **********************/ -/*****************************************************************************/ - -static void Usr_PutActionShowRecords (void) - { - extern const char *Txt_Show_records; - - Usr_StartListUsrsAction (Usr_SHOW_RECORDS); - fprintf (Gbl.F.Out,"%s",Txt_Show_records); - Usr_EndListUsrsAction (); - } - -/*****************************************************************************/ -/******************** Put action to show users' homework *********************/ -/*****************************************************************************/ - -static void Usr_PutActionShowHomework (void) - { - extern const char *Txt_View_homework; - - Usr_StartListUsrsAction (Usr_VIEW_HOMEWORK); - fprintf (Gbl.F.Out,"%s",Txt_View_homework); - Usr_EndListUsrsAction (); - } - -/*****************************************************************************/ -/******************** Put action to show users' attendance *******************/ -/*****************************************************************************/ - -static void Usr_PutActionShowAttendance (void) - { - extern const char *Txt_Show_attendance; - - Usr_StartListUsrsAction (Usr_SHOW_ATTENDANCE); - fprintf (Gbl.F.Out,"%s",Txt_Show_attendance); - Usr_EndListUsrsAction (); - } - -/*****************************************************************************/ -/*************** Put action to write a new message to users ******************/ -/*****************************************************************************/ - -static void Usr_PutActionNewMessage (void) - { - extern const char *Txt_Send_message; - - Usr_StartListUsrsAction (Usr_NEW_MESSAGE); - fprintf (Gbl.F.Out,"%s",Txt_Send_message); - Usr_EndListUsrsAction (); - } - -/*****************************************************************************/ -/*********************** Put action to follow users **************************/ -/*****************************************************************************/ - -static void Usr_PutActionFollowUsers (void) - { - extern const char *Txt_Follow; - - Usr_StartListUsrsAction (Usr_FOLLOW_USERS); - fprintf (Gbl.F.Out,"%s",Txt_Follow); - Usr_EndListUsrsAction (); - } - -/*****************************************************************************/ -/*********************** Put action to follow users **************************/ -/*****************************************************************************/ - -static void Usr_PutActionUnfollowUsers (void) - { - extern const char *Txt_Unfollow; - - Usr_StartListUsrsAction (Usr_UNFOLLOW_USERS); - fprintf (Gbl.F.Out,"%s",Txt_Unfollow); - Usr_EndListUsrsAction (); - } - /*****************************************************************************/ /************ Put start/end of action to register/remove one user ************/ /*****************************************************************************/ -static void Usr_StartListUsrsAction (Usr_ListUsrsAction_t ListUsrsAction) +static void Usr_ShowOneListUsrsOption (Usr_ListUsrsOption_t ListUsrsAction, + const char *Label) { fprintf (Gbl.F.Out,"
  • " "" - "" - "
  • "); + "" + "", + (unsigned) ListUsrsAction, + Label); } /*****************************************************************************/ @@ -8255,14 +8146,14 @@ void Usr_DoActionOnSeveralUsrs1 (void) } /* Get the action to do */ - Gbl.Usrs.Selected.Action = Usr_ListUsrsAction (Usr_LIST_USRS_UNKNOWN_ACTION); + Gbl.Usrs.Selected.Option = Usr_GetListUsrsOption (Usr_OPTION_UNKNOWN); /***** Change action depending on my selection *****/ - Gbl.Action.Original = Gbl.Action.Act; + Gbl.Action.Original = Gbl.Action.Act; // To check if action changes - switch (Gbl.Usrs.Selected.Action) + switch (Gbl.Usrs.Selected.Option) { - case Usr_SHOW_RECORDS: + case Usr_OPTION_RECORDS: switch (Gbl.Action.Act) { case ActDoActOnSevGst: @@ -8275,11 +8166,10 @@ void Usr_DoActionOnSeveralUsrs1 (void) Gbl.Action.Act = ActSeeRecSevTch; break; default: - Ale_CreateAlert (Ale_ERROR,NULL,"Wrong action."); break; } break; - case Usr_VIEW_HOMEWORK: + case Usr_OPTION_HOMEWORK: switch (Gbl.Action.Act) { case ActDoActOnSevStd: @@ -8287,22 +8177,20 @@ void Usr_DoActionOnSeveralUsrs1 (void) Gbl.Action.Act = ActAdmAsgWrkCrs; break; default: - Ale_CreateAlert (Ale_ERROR,NULL,"Wrong action."); break; } break; - case Usr_SHOW_ATTENDANCE: + case Usr_OPTION_ATTENDANCE: switch (Gbl.Action.Act) { case ActDoActOnSevStd: Gbl.Action.Act = ActSeeLstStdAtt; break; default: - Ale_CreateAlert (Ale_ERROR,NULL,"Wrong action."); break; } break; - case Usr_NEW_MESSAGE: + case Usr_OPTION_MESSAGE: switch (Gbl.Action.Act) { case ActDoActOnSevStd: @@ -8310,11 +8198,10 @@ void Usr_DoActionOnSeveralUsrs1 (void) Gbl.Action.Act = ActReqMsgUsr; break; default: - Ale_CreateAlert (Ale_ERROR,NULL,"Wrong action."); break; } break; - case Usr_FOLLOW_USERS: + case Usr_OPTION_FOLLOW: switch (Gbl.Action.Act) { case ActDoActOnSevStd: @@ -8324,11 +8211,10 @@ void Usr_DoActionOnSeveralUsrs1 (void) Gbl.Action.Act = ActReqFolSevTch; break; default: - Ale_CreateAlert (Ale_ERROR,NULL,"Wrong action."); break; } break; - case Usr_UNFOLLOW_USERS: + case Usr_OPTION_UNFOLLOW: switch (Gbl.Action.Act) { case ActDoActOnSevStd: @@ -8338,16 +8224,16 @@ void Usr_DoActionOnSeveralUsrs1 (void) Gbl.Action.Act = ActReqUnfSevTch; break; default: - Ale_CreateAlert (Ale_ERROR,NULL,"Wrong action."); break; } break; default: - Ale_CreateAlert (Ale_ERROR,NULL,"Wrong action."); break; } - if (Gbl.Action.Act != Gbl.Action.Original) // Action has changed + if (Gbl.Action.Act == Gbl.Action.Original) // Fail, no change in action + Ale_CreateAlert (Ale_ERROR,NULL,"Wrong action."); + else // Success, action has changed Tab_SetCurrentTab (); } @@ -8356,7 +8242,9 @@ void Usr_DoActionOnSeveralUsrs2 (void) /***** Show possible alerts *****/ Ale_ShowAlerts (NULL); - /***** If action has not changed, show again the form *****/ + /***** If success, action has changed. + No change in action means an error in form has happened, + so show again the form to selected users *****/ switch (Gbl.Action.Act) { case ActDoActOnSevGst: @@ -8368,6 +8256,8 @@ void Usr_DoActionOnSeveralUsrs2 (void) case ActDoActOnSevTch: Usr_SeeTeachers (); break; + default: + break; } } @@ -8375,11 +8265,11 @@ void Usr_DoActionOnSeveralUsrs2 (void) /*************** Get action to do with list of selected users ****************/ /*****************************************************************************/ -static Usr_ListUsrsAction_t Usr_ListUsrsAction (Usr_ListUsrsAction_t DefaultAction) +static Usr_ListUsrsOption_t Usr_GetListUsrsOption (Usr_ListUsrsOption_t DefaultAction) { - return (Usr_ListUsrsAction_t) Par_GetParToUnsignedLong ("ListUsrsAction", + return (Usr_ListUsrsOption_t) Par_GetParToUnsignedLong ("ListUsrsAction", 0, - Usr_LIST_USRS_NUM_ACTIONS - 1, + Usr_LIST_USRS_NUM_OPTIONS - 1, (unsigned long) DefaultAction); } diff --git a/swad_user.h b/swad_user.h index 7d88d5f7..765c176d 100644 --- a/swad_user.h +++ b/swad_user.h @@ -115,18 +115,18 @@ typedef enum } Usr_ShowUsrsType_t; #define Usr_SHOW_USRS_TYPE_DEFAULT Usr_LIST_AS_CLASS_PHOTO -#define Usr_LIST_USRS_NUM_ACTIONS 7 +#define Usr_LIST_USRS_NUM_OPTIONS 7 typedef enum { - Usr_LIST_USRS_UNKNOWN_ACTION = 0, - Usr_SHOW_RECORDS = 1, - Usr_VIEW_HOMEWORK = 2, - Usr_SHOW_ATTENDANCE = 3, - Usr_NEW_MESSAGE = 4, - Usr_FOLLOW_USERS = 5, - Usr_UNFOLLOW_USERS = 6, - } Usr_ListUsrsAction_t; -#define Usr_LIST_USRS_DEFAULT_ACTION Usr_SHOW_RECORDS + Usr_OPTION_UNKNOWN = 0, + Usr_OPTION_RECORDS = 1, + Usr_OPTION_HOMEWORK = 2, + Usr_OPTION_ATTENDANCE = 3, + Usr_OPTION_MESSAGE = 4, + Usr_OPTION_FOLLOW = 5, + Usr_OPTION_UNFOLLOW = 6, + } Usr_ListUsrsOption_t; +#define Usr_LIST_USRS_DEFAULT_OPTION Usr_OPTION_RECORDS // Related with user's data struct UsrData