From 15a58fd5c690adf4717cf9b319f72bbf2dbb59b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Fri, 15 Nov 2019 03:34:48 +0100 Subject: [PATCH] Version19.69 --- swad_ID.c | 2 +- swad_action.c | 2 +- swad_assignment.c | 5 +- swad_attendance.c | 20 +-- swad_changelog.h | 5 +- swad_duplicate.c | 6 +- swad_file_browser.c | 12 +- swad_follow.c | 26 ++-- swad_global.c | 3 +- swad_global.h | 7 +- swad_mail.c | 6 +- swad_match_result.c | 11 +- swad_message.c | 18 +-- swad_project.c | 97 ++++++++++----- swad_project.h | 2 +- swad_record.c | 34 +++--- swad_session.c | 15 +-- swad_session.h | 4 +- swad_statistic.c | 20 +-- swad_test.c | 11 +- swad_user.c | 291 ++++++++++++++++++++++++++++---------------- swad_user.h | 37 ++++-- swad_zip.c | 2 +- 23 files changed, 386 insertions(+), 250 deletions(-) diff --git a/swad_ID.c b/swad_ID.c index acfa1c03..ff260340 100644 --- a/swad_ID.c +++ b/swad_ID.c @@ -483,7 +483,7 @@ static void ID_PutLinkToConfirmID (struct UsrData *UsrDat,unsigned NumID, case ActSeeRecSevGst: case ActSeeRecSevStd: case ActSeeRecSevTch: - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); break; default: break; diff --git a/swad_action.c b/swad_action.c index c36064d2..353c64fa 100644 --- a/swad_action.c +++ b/swad_action.c @@ -2079,7 +2079,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActReqRemPrj */{1680,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_ReqRemProject ,NULL}, /* ActRemPrj */{1681,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_RemoveProject ,NULL}, /* ActHidPrj */{1682,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_HideProject ,NULL}, - /* ActShoPrj */{1683,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_ShowProject ,NULL}, + /* ActShoPrj */{1683,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_UnhideProject ,NULL}, /* ActLckPrj */{1773,-1,TabUnk,ActSeePrj ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_NORMAL,NULL ,Prj_LockProjectEdition ,NULL}, /* ActUnlPrj */{1774,-1,TabUnk,ActSeePrj ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_NORMAL,NULL ,Prj_UnloProjectEdition ,NULL}, /* ActReqAddStdPrj */{1684,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_ReqAddStds ,NULL}, diff --git a/swad_assignment.c b/swad_assignment.c index 838071d3..c7c9d841 100644 --- a/swad_assignment.c +++ b/swad_assignment.c @@ -503,7 +503,8 @@ static void Asg_WriteAssignmentFolder (struct Assignment *Asg,bool PrintView) Gbl.FileBrowser.Type = Brw_ADMI_ASG_CRS; // Course assignments Str_Copy (Gbl.Usrs.Other.UsrDat.EncryptedUsrCod,Gbl.Usrs.Me.UsrDat.EncryptedUsrCod, Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64); - Usr_CreateListSelectedUsrsCodsAndFillWithOtherUsr (); + Usr_CreateListSelectedUsrsCodsAndFillWithOtherUsr (&Gbl.Usrs.Selected) +; Frm_StartForm (ActFrmCreAsgCrs); break; default: @@ -525,7 +526,7 @@ static void Asg_WriteAssignmentFolder (struct Assignment *Asg,bool PrintView) break; case Rol_NET: case Rol_TCH: - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); break; default: break; diff --git a/swad_attendance.c b/swad_attendance.c index d92ec65f..4a6c776d 100644 --- a/swad_attendance.c +++ b/swad_attendance.c @@ -2335,7 +2335,7 @@ void Att_RegisterStudentsInAttEvent (void) Gbl.Usrs.LstUsrs[Rol_STD].Lst[NumUsr].Remove = true; /***** 3. Get list of students marked as present by me: Gbl.Usrs.Selected.List[Rol_STD] *****/ - Usr_GetListsSelectedUsrsCods (); + Usr_GetListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /***** Initialize structure with user's data *****/ Usr_UsrDataConstructor (&UsrData); @@ -2366,7 +2366,7 @@ void Att_RegisterStudentsInAttEvent (void) /***** Free memory *****/ /* Free memory used by list of selected students' codes */ - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); // 5. Delete from att_usr all the students marked as Remove=true // 6. Replace (insert without duplicated) into att_usr all the students marked as Remove=false @@ -2657,7 +2657,8 @@ void Att_ReqListUsrsAttendanceCrs (void) Att_GetListAttEvents (Att_OLDEST_FIRST); /***** List users to select some of them *****/ - Usr_PutFormToSelectUsrsToGoToAct (ActSeeLstUsrAtt,NULL, + Usr_PutFormToSelectUsrsToGoToAct (&Gbl.Usrs.Selected, + ActSeeLstUsrAtt,NULL, Txt_Attendance_list, Hlp_USERS_Attendance_attendance_list, Txt_View_attendance); @@ -2761,7 +2762,8 @@ void Att_PrintUsrsAttendanceCrs (void) static void Att_GetUsrsAndListOrPrintAttendanceCrs (void) { - Usr_GetSelectedUsrsAndGoToAct (Att_ListOrPrintUsrsAttendanceCrs, + Usr_GetSelectedUsrsAndGoToAct (&Gbl.Usrs.Selected, + Att_ListOrPrintUsrsAttendanceCrs, Att_ReqListUsrsAttendanceCrs); } @@ -2781,12 +2783,12 @@ static void Att_ListOrPrintUsrsAttendanceCrs (void) Grp_GetParCodsSeveralGrpsToShowUsrs (); /***** Count number of valid users in list of encrypted user codes *****/ - NumUsrsInList = Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods (); + NumUsrsInList = Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods (&Gbl.Usrs.Selected); if (NumUsrsInList) { /***** Get list of students selected to show their attendances *****/ - Usr_GetListSelectedUsrCods (NumUsrsInList,&LstSelectedUsrCods); + Usr_GetListSelectedUsrCods (&Gbl.Usrs.Selected,NumUsrsInList,&LstSelectedUsrCods); /***** Get list of attendance events *****/ Att_GetListAttEvents (Att_OLDEST_FIRST); @@ -2990,7 +2992,7 @@ static void Att_PutParamsToPrintStdsList (void) if (Gbl.AttEvents.ShowDetails) Par_PutHiddenParamChar ("ShowDetails",'Y'); Grp_PutParamsCodGrps (); - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); if (Gbl.AttEvents.StrAttCodsSelected) if (Gbl.AttEvents.StrAttCodsSelected[0]) Par_PutHiddenParamString (NULL,"AttCods",Gbl.AttEvents.StrAttCodsSelected); @@ -3008,7 +3010,7 @@ static void Att_PutButtonToShowDetails (void) Frm_StartFormAnchor (Gbl.Action.Act,Att_ATTENDANCE_DETAILS_ID); Par_PutHiddenParamChar ("ShowDetails",'Y'); Grp_PutParamsCodGrps (); - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); if (Gbl.AttEvents.StrAttCodsSelected) if (Gbl.AttEvents.StrAttCodsSelected[0]) Par_PutHiddenParamString (NULL,"AttCods",Gbl.AttEvents.StrAttCodsSelected); @@ -3047,7 +3049,7 @@ static void Att_ListEventsToSelect (void) { Frm_StartFormAnchor (Gbl.Action.Act,Att_ATTENDANCE_TABLE_ID); Grp_PutParamsCodGrps (); - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); } /***** Begin table *****/ diff --git a/swad_changelog.h b/swad_changelog.h index d951ef66..0693278e 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -468,6 +468,7 @@ contiene una de las que yo imparto. As // TODO: Mostrar cifras sobre partidas (matches) en el apartado Figures > Games. // TODO: En resultados de test y de juegos, en preguntas modificadas se podría mostrar la puntuación obtenida en la pregunta (ahora no sale) // TODO: Al crear un nuevo juego, debería irse a la pantalla de añadir preguntas (la misma opción que sale cuando pulsas en editar un juego existente) +// TODO: Code refactoring in HTML h1, title, meta, video, p, iframe, input hidden, area /*****************************************************************************/ /****************************** Public constants *****************************/ @@ -487,14 +488,14 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - * En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 19.68.2 (2019-11-14)" +#define Log_PLATFORM_VERSION "SWAD 19.69 (2019-11-15)" #define CSS_FILE "swad19.47.css" #define JS_FILE "swad19.65.js" /* // TODO: Hacer un nuevo rol en los TFG: tutor externo (profesor de áreas no vinculadas con el centro, profesionales de empresas, etc.) // TODO: Impedir la creación y edición de proyectos si no son editables. -// TODO: Code refactoring in HTML h1, title, meta, video, p, iframe, input hidden, area + Version 19.69: Nov 15, 2019 Code refactoring related with lists of users and hidden parameters. (246752 lines) Version 19.68.2: Nov 14, 2019 Code refactoring in users and attendance. (246625 lines) Version 19.68.1: Nov 14, 2019 Code refactoring in match results. Code refactoring in test results. (246623 lines) diff --git a/swad_duplicate.c b/swad_duplicate.c index 1cc4f6d8..419aa42b 100644 --- a/swad_duplicate.c +++ b/swad_duplicate.c @@ -183,7 +183,8 @@ void Dup_ListDuplicateUsrs (void) UsrDat.Accepted = false; /* Write data of this user */ - Usr_WriteRowUsrMainData (NumUsrs - NumUsr,&UsrDat,false,Rol_UNK); + Usr_WriteRowUsrMainData (NumUsrs - NumUsr,&UsrDat,false,Rol_UNK, + &Gbl.Usrs.Selected); HTM_TR_Begin (NULL); @@ -320,7 +321,8 @@ static void Dup_ListSimilarUsrs (void) UsrDat.Accepted = false; /***** Write data of this user *****/ - Usr_WriteRowUsrMainData (NumUsrs - NumUsr,&UsrDat,false,Rol_UNK); + Usr_WriteRowUsrMainData (NumUsrs - NumUsr,&UsrDat,false,Rol_UNK, + &Gbl.Usrs.Selected); /***** Write user's profile and user's courses *****/ HTM_TR_Begin (NULL); diff --git a/swad_file_browser.c b/swad_file_browser.c index 2a4f58d6..9bfb5da2 100644 --- a/swad_file_browser.c +++ b/swad_file_browser.c @@ -2059,7 +2059,7 @@ void Brw_GetParAndInitFileBrowser (void) else if (Brw_GetIfCrsAssigWorksFileBrowser ()) { /* Get lists of the selected users if not already got */ - Usr_GetListsSelectedUsrsCods (); + Usr_GetListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /* Get user whose folder will be used to make any operation */ Usr_GetParamOtherUsrCodEncryptedAndGetListIDs (); /* Get whether we must create the zip file or not */ @@ -2305,7 +2305,7 @@ static void Brw_PutParamsFileBrowser (const char *PathInTree,const char *FilFolL else if (Brw_GetIfCrsAssigWorksFileBrowser ()) { /***** Users selected *****/ - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); Usr_PutParamOtherUsrCodEncrypted (); } @@ -3075,7 +3075,8 @@ void Brw_AskEditWorksCrs (void) extern const char *Txt_View_homework; /***** List users to select some of them *****/ - Usr_PutFormToSelectUsrsToGoToAct (ActAdmAsgWrkCrs,NULL, + Usr_PutFormToSelectUsrsToGoToAct (&Gbl.Usrs.Selected, + ActAdmAsgWrkCrs,NULL, Txt_Assignments_and_other_works, Hlp_FILES_Homework_for_teachers, Txt_View_homework); @@ -3422,7 +3423,8 @@ static void Brw_ShowDataOwnerAsgWrk (struct UsrData *UsrDat) void Brw_GetSelectedUsrsAndShowWorks (void) { - Usr_GetSelectedUsrsAndGoToAct (Brw_ShowFileBrowserOrWorks, // when user(s) selected + Usr_GetSelectedUsrsAndGoToAct (&Gbl.Usrs.Selected, + Brw_ShowFileBrowserOrWorks, // when user(s) selected Brw_AskEditWorksCrs); // when no user selected } @@ -4936,7 +4938,7 @@ static void Brw_PutParamsFullTree (void) else if (Brw_GetIfProjectFileBrowser ()) // This file browser needs specify a project Prj_PutParamPrjCod (Gbl.Prjs.PrjCod); else if (Brw_GetIfCrsAssigWorksFileBrowser ()) - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); } /*****************************************************************************/ diff --git a/swad_follow.c b/swad_follow.c index e4b75767..a0c1636a 100644 --- a/swad_follow.c +++ b/swad_follow.c @@ -98,6 +98,7 @@ static void Fol_PutIconToUnfollow (struct UsrData *UsrDat); static void Fol_RequestFollowUsrs (Act_Action_t NextAction); static void Fol_RequestUnfollowUsrs (Act_Action_t NextAction); +static void Fol_PutHiddenParSelectedUsrsCods (void); static void Fol_GetFollowedFromSelectedUsrs (unsigned *NumFollowed, unsigned *NumNotFollowed); @@ -1091,19 +1092,19 @@ static void Fol_RequestFollowUsrs (Act_Action_t NextAction) { if (NumNotFollowed == 1) Ale_ShowAlertAndButton (NextAction,NULL,NULL, - Usr_PutHiddenParSelectedUsrsCods, + Fol_PutHiddenParSelectedUsrsCods, Btn_CREATE_BUTTON,Txt_Follow, Ale_QUESTION,Txt_Do_you_want_to_follow_the_selected_user_whom_you_do_not_follow_yet); else Ale_ShowAlertAndButton (NextAction,NULL,NULL, - Usr_PutHiddenParSelectedUsrsCods, + Fol_PutHiddenParSelectedUsrsCods, Btn_CREATE_BUTTON,Txt_Follow, Ale_QUESTION,Txt_Do_you_want_to_follow_the_X_selected_users_whom_you_do_not_follow_yet, NumNotFollowed); } /***** Free memory used by list of selected users' codes *****/ - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); } void Fol_RequestUnfollowStds (void) @@ -1135,19 +1136,24 @@ static void Fol_RequestUnfollowUsrs (Act_Action_t NextAction) { if (NumFollowed == 1) Ale_ShowAlertAndButton (NextAction,NULL,NULL, - Usr_PutHiddenParSelectedUsrsCods, + Fol_PutHiddenParSelectedUsrsCods, Btn_CREATE_BUTTON,Txt_Unfollow, Ale_QUESTION,Txt_Do_you_want_to_stop_following_the_selected_user_whom_you_follow); else Ale_ShowAlertAndButton (NextAction,NULL,NULL, - Usr_PutHiddenParSelectedUsrsCods, + Fol_PutHiddenParSelectedUsrsCods, Btn_CREATE_BUTTON,Txt_Unfollow, Ale_QUESTION,Txt_Do_you_want_to_stop_following_the_X_selected_users_whom_you_follow, NumFollowed); } /***** Free memory used by list of selected users' codes *****/ - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); + } + +static void Fol_PutHiddenParSelectedUsrsCods (void) + { + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); } /*****************************************************************************/ @@ -1211,7 +1217,7 @@ void Fol_FollowUsrs () unsigned NumFollowed = 0; /***** Get list of selected users if not already got *****/ - Usr_GetListsSelectedUsrsCods (); + Usr_GetListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /***** Initialize structure with user's data *****/ Usr_UsrDataConstructor (&UsrDat); @@ -1239,7 +1245,7 @@ void Fol_FollowUsrs () Usr_UsrDataDestructor (&UsrDat); /***** Free memory used by list of selected users' codes *****/ - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /***** Show alert *****/ if (NumFollowed == 1) @@ -1258,7 +1264,7 @@ void Fol_UnfollowUsrs (void) unsigned NumUnfollowed = 0; /***** Get list of selected users if not already got *****/ - Usr_GetListsSelectedUsrsCods (); + Usr_GetListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /***** Initialize structure with user's data *****/ Usr_UsrDataConstructor (&UsrDat); @@ -1286,7 +1292,7 @@ void Fol_UnfollowUsrs (void) Usr_UsrDataDestructor (&UsrDat); /***** Free memory used by list of selected users' codes *****/ - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /***** Show alert *****/ if (NumUnfollowed == 1) diff --git a/swad_global.c b/swad_global.c index e85add59..fe709630 100644 --- a/swad_global.c +++ b/swad_global.c @@ -192,6 +192,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.ParamSuffix = NULL;// Don't add suffix to param names Gbl.Usrs.Selected.Option = Usr_OPTION_UNKNOWN; for (Role = (Rol_Role_t) 0; Role < Rol_NUM_ROLES; @@ -466,7 +467,7 @@ void Gbl_Cleanup (void) Usr_FreeUsrsList (Role); Usr_FreeListOtherRecipients (); - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); Syl_FreeListItemsSyllabus (); Tst_FreeTagsList (); Exa_FreeMemExamAnnouncement (); diff --git a/swad_global.h b/swad_global.h index 1f67cca4..b779f5a6 100644 --- a/swad_global.h +++ b/swad_global.h @@ -377,12 +377,7 @@ struct Globals unsigned NumIDToConfirm; // Used as hidden parameter to confirm a user's ID } Other; // Another user, used for example to register in / remove from a course struct ListUsrs LstUsrs[Rol_NUM_ROLES]; - struct - { - char *List[Rol_NUM_ROLES]; // Lists of encrypted codes of users selected from a form - bool Filled; // If lists are already filled/readed - Usr_ListUsrsOption_t Option; // What option I have selected to do with these selected users - } Selected; + struct SelectedUsrs Selected; char *ListOtherRecipients; // List of ID or nicks of users written explicitely on a form struct { diff --git a/swad_mail.c b/swad_mail.c index c5b47bc1..0e2c3910 100644 --- a/swad_mail.c +++ b/swad_mail.c @@ -870,7 +870,8 @@ void Mai_ReqUsrsToListEmails (void) extern const char *Txt_View_email_addresses; /***** List users to select some of them *****/ - Usr_PutFormToSelectUsrsToGoToAct (ActMaiUsr,NULL, + Usr_PutFormToSelectUsrsToGoToAct (&Gbl.Usrs.Selected, + ActMaiUsr,NULL, Txt_Email, Hlp_MESSAGES_Email, Txt_View_email_addresses); @@ -882,7 +883,8 @@ void Mai_ReqUsrsToListEmails (void) void Mai_GetSelectedUsrsAndListEmails (void) { - Usr_GetSelectedUsrsAndGoToAct (Mai_ListEmails, // when user(s) selected + Usr_GetSelectedUsrsAndGoToAct (&Gbl.Usrs.Selected, + Mai_ListEmails, // when user(s) selected Mai_ReqUsrsToListEmails); // when no user selected } diff --git a/swad_match_result.c b/swad_match_result.c index e0dd8f3e..7fdfe3b2 100644 --- a/swad_match_result.c +++ b/swad_match_result.c @@ -215,9 +215,9 @@ void McR_SelUsrsToViewUsrsMchResults (void) HTM_TD_Begin ("colspan=\"2\" class=\"%s LT\"",The_ClassFormInBox[Gbl.Prefs.Theme]); HTM_TABLE_BeginPadding (2); - Usr_ListUsersToSelect (Rol_TCH); - Usr_ListUsersToSelect (Rol_NET); - Usr_ListUsersToSelect (Rol_STD); + Usr_ListUsersToSelect (Rol_TCH,&Gbl.Usrs.Selected); + Usr_ListUsersToSelect (Rol_NET,&Gbl.Usrs.Selected); + Usr_ListUsersToSelect (Rol_STD,&Gbl.Usrs.Selected); HTM_TABLE_End (); HTM_TD_End (); @@ -251,7 +251,7 @@ void McR_SelUsrsToViewUsrsMchResults (void) Usr_FreeUsrsList (Rol_STD); /***** Free memory used by list of selected users' codes *****/ - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /***** Free memory for list of selected groups *****/ Grp_FreeListCodSelectedGrps (); @@ -263,7 +263,8 @@ void McR_SelUsrsToViewUsrsMchResults (void) void McR_GetUsrsAndShowMchResults (void) { - Usr_GetSelectedUsrsAndGoToAct (McR_ShowUsrsMchResults, + Usr_GetSelectedUsrsAndGoToAct (&Gbl.Usrs.Selected, + McR_ShowUsrsMchResults, McR_SelUsrsToViewUsrsMchResults); } diff --git a/swad_message.c b/swad_message.c index e812527d..5d1c7f34 100644 --- a/swad_message.c +++ b/swad_message.c @@ -261,7 +261,7 @@ static void Msg_PutFormMsgUsrs (char Content[Cns_MAX_BYTES_LONG_TEXT + 1]) if (ShowUsrsInCrs) /***** Get lists of selected users *****/ - Usr_GetListsSelectedUsrsCods (); + Usr_GetListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); } /***** End section with user list *****/ @@ -306,9 +306,9 @@ static void Msg_PutFormMsgUsrs (char Content[Cns_MAX_BYTES_LONG_TEXT + 1]) HTM_TABLE_BeginWide (); if (ShowUsrsInCrs) { - Usr_ListUsersToSelect (Rol_TCH); // All teachers in course - Usr_ListUsersToSelect (Rol_NET); // All non-editing teachers in course - Usr_ListUsersToSelect (Rol_STD); // All students in selected groups + Usr_ListUsersToSelect (Rol_TCH,&Gbl.Usrs.Selected); // All teachers in course + Usr_ListUsersToSelect (Rol_NET,&Gbl.Usrs.Selected); // All non-editing teachers in course + Usr_ListUsersToSelect (Rol_STD,&Gbl.Usrs.Selected); // All students in selected groups } Msg_WriteFormUsrsIDsOrNicksOtherRecipients (); // Other users (nicknames) HTM_TABLE_End (); @@ -350,7 +350,7 @@ static void Msg_PutFormMsgUsrs (char Content[Cns_MAX_BYTES_LONG_TEXT + 1]) } /***** Free memory used by list of selected users' codes *****/ - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /***** Free memory for list of selected groups *****/ Grp_FreeListCodSelectedGrps (); @@ -398,7 +398,7 @@ static void Msg_PutParamsShowMorePotentialRecipients (void) static void Msg_PutParamsWriteMsg (void) { - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); Msg_PutHiddenParamOtherRecipients (); Msg_PutHiddenParamsSubjectAndContent (); if (Gbl.Msg.Reply.IsReply) @@ -722,13 +722,13 @@ void Msg_RecMsgFromUsr (void) Usr_GetParamOtherUsrCodEncryptedAndGetListIDs (); /* Get lists of selected users */ - Usr_GetListsSelectedUsrsCods (); + Usr_GetListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /* Get list of users' IDs or nicknames written explicitely */ Error = Usr_GetListMsgRecipientsWrittenExplicitelyBySender (true); /***** Check number of recipients *****/ - if ((NumRecipients = Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods ())) + if ((NumRecipients = Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods (&Gbl.Usrs.Selected))) { if (Gbl.Usrs.Me.Role.Logged == Rol_STD && NumRecipients > Cfg_MAX_RECIPIENTS) @@ -847,7 +847,7 @@ void Msg_RecMsgFromUsr (void) /***** Free memory *****/ /* Free memory used for list of users */ Usr_FreeListOtherRecipients (); - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /***** Update received message setting Replied field to true *****/ if (Replied) diff --git a/swad_project.c b/swad_project.c index b3b584d1..2c4bff6c 100644 --- a/swad_project.c +++ b/swad_project.c @@ -108,6 +108,28 @@ static const Act_Action_t Prj_LockActions[Prj_NUM_LOCKED_UNLOCKED] = ActLckPrj, // Prj_UNLOCKED }; +/***** List of users to select one or more members + to be added to a project *****/ +struct SelectedUsrs Prj_MembersToAdd = + { + .List = + { + NULL, // Rol_UNK + NULL, // Rol_GST + NULL, // Rol_USR + NULL, // Rol_STD + NULL, // Rol_NET + NULL, // Rol_TCH + NULL, // Rol_DEG_ADM + NULL, // Rol_CTR_ADM + NULL, // Rol_INS_ADM + NULL, // Rol_SYS_ADM + }, + .Filled = false, + .ParamSuffix = "Member", + .Option = Usr_OPTION_UNKNOWN, + }; + /*****************************************************************************/ /******************************* Private types *******************************/ /*****************************************************************************/ @@ -125,9 +147,9 @@ struct Prj_Faults /*****************************************************************************/ static void Prj_ReqUsrsToSelect (void); -static void Prj_GetSelectedUsrsAndShowPrjs (void); - -static void Prj_ShowProjectsInCurrentPage (void); +static void Prj_GetSelectedUsrsAndShowTheirPrjs (void); +static void Prj_ShowProjects (void); +static void Prj_ShowPrjsInCurrentPage (void); static void Prj_ShowFormToFilterByMy_All (void); static void Prj_ShowFormToFilterByAssign (void); @@ -251,14 +273,15 @@ static void Prj_ReqUsrsToSelect (void) extern const char *Txt_View_projects; /***** List users to select some of them *****/ - Usr_PutFormToSelectUsrsToGoToAct (ActSeePrj,Prj_PutCurrentParams, + Usr_PutFormToSelectUsrsToGoToAct (&Gbl.Usrs.Selected, + ActSeePrj,Prj_PutCurrentParams, Txt_Projects, Hlp_ASSESSMENT_Projects, Txt_View_projects); } /*****************************************************************************/ -/******************************* Show projects *******************************/ +/******************* Get parameters and show projects ************************/ /*****************************************************************************/ void Prj_SeeProjects (void) @@ -267,16 +290,25 @@ void Prj_SeeProjects (void) Prj_GetParams (); /***** Show projects *****/ + Prj_ShowProjects (); + } + +/*****************************************************************************/ +/******************************* Show projects *******************************/ +/*****************************************************************************/ + +static void Prj_ShowProjects (void) + { switch (Gbl.Prjs.Filter.Who) { case Usr_WHO_ME: case Usr_WHO_ALL: /* Show my projects / all projects */ - Prj_ShowProjectsInCurrentPage (); + Prj_ShowPrjsInCurrentPage (); break; case Usr_WHO_SELECTED: /* Get selected users and show their projects */ - Prj_GetSelectedUsrsAndShowPrjs (); + Prj_GetSelectedUsrsAndShowTheirPrjs (); break; default: break; @@ -287,9 +319,10 @@ void Prj_SeeProjects (void) /****** Get and check list of selected users, and show users' projects *******/ /*****************************************************************************/ -static void Prj_GetSelectedUsrsAndShowPrjs (void) +static void Prj_GetSelectedUsrsAndShowTheirPrjs (void) { - Usr_GetSelectedUsrsAndGoToAct (Prj_ShowProjectsInCurrentPage,// when user(s) selected + Usr_GetSelectedUsrsAndGoToAct (&Gbl.Usrs.Selected, + Prj_ShowPrjsInCurrentPage, // when user(s) selected Prj_ReqUsrsToSelect); // when no user selected } @@ -344,7 +377,7 @@ void Prj_ShowTableSelectedPrjs (void) /****************** Show the projects in current page ************************/ /*****************************************************************************/ -static void Prj_ShowProjectsInCurrentPage (void) +static void Prj_ShowPrjsInCurrentPage (void) { extern const char *Hlp_ASSESSMENT_Projects; extern const char *Txt_Projects; @@ -706,7 +739,7 @@ void Prj_PutParams (struct Prj_Filter *Filter, /***** Put selected users' codes *****/ if (Filter->Who == Usr_WHO_SELECTED) - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); } /*****************************************************************************/ @@ -801,6 +834,10 @@ static void Prj_GetParams (void) /***** Get order and page *****/ Prj_GetParamPrjOrder (); Gbl.Prjs.CurrentPage = Pag_GetParamPagNum (Pag_PROJECTS); + + /***** Get selected users *****/ + if (Gbl.Prjs.Filter.Who == Usr_WHO_SELECTED) + Usr_GetListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); } /*****************************************************************************/ @@ -2247,7 +2284,8 @@ static void Prj_ReqAddUsrs (Prj_RoleInProject_t RoleInProject) snprintf (TxtButton,sizeof (TxtButton), Txt_Add_USERS, Txt_PROJECT_ROLES_PLURAL_abc[RoleInProject]); - Usr_PutFormToSelectUsrsToGoToAct (ActionAddUsr[RoleInProject],Prj_PutCurrentParams, + Usr_PutFormToSelectUsrsToGoToAct (&Prj_MembersToAdd, + ActionAddUsr[RoleInProject],Prj_PutCurrentParams, TxtButton, Hlp_ASSESSMENT_Projects_add_user, TxtButton); @@ -2262,19 +2300,22 @@ static void Prj_ReqAddUsrs (Prj_RoleInProject_t RoleInProject) void Prj_GetSelectedUsrsAndAddStds (void) { - Usr_GetSelectedUsrsAndGoToAct (Prj_AddStds, // when user(s) selected + Usr_GetSelectedUsrsAndGoToAct (&Prj_MembersToAdd, + Prj_AddStds, // when user(s) selected Prj_ReqAddStds); // when no user selected } void Prj_GetSelectedUsrsAndAddTuts (void) { - Usr_GetSelectedUsrsAndGoToAct (Prj_AddTuts, // when user(s) selected + Usr_GetSelectedUsrsAndGoToAct (&Prj_MembersToAdd, + Prj_AddTuts, // when user(s) selected Prj_ReqAddTuts); // when no user selected } void Prj_GetSelectedUsrsAndAddEvls (void) { - Usr_GetSelectedUsrsAndGoToAct (Prj_AddEvls, // when user(s) selected + Usr_GetSelectedUsrsAndGoToAct (&Prj_MembersToAdd, + Prj_AddEvls, // when user(s) selected Prj_ReqAddEvls); // when no user selected } @@ -2775,12 +2816,12 @@ static void Prj_GetListProjects (void) break; case Usr_WHO_SELECTED: /* Count number of valid users in list of encrypted user codes */ - NumUsrsInList = Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods (); + NumUsrsInList = Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods (&Gbl.Usrs.Selected); if (NumUsrsInList) { /* Get list of users selected to show their projects */ - Usr_GetListSelectedUsrCods (NumUsrsInList,&LstSelectedUsrCods); + Usr_GetListSelectedUsrCods (&Gbl.Usrs.Selected,NumUsrsInList,&LstSelectedUsrCods); /* Create subquery string */ Usr_CreateSubqueryUsrCods (LstSelectedUsrCods,NumUsrsInList, @@ -3162,7 +3203,7 @@ void Prj_ReqRemProject (void) Prj_FreeMemProject (&Prj); /***** Show projects again *****/ - Prj_ShowProjectsInCurrentPage (); + Prj_ShowProjects (); } /*****************************************************************************/ @@ -3225,7 +3266,7 @@ void Prj_RemoveProject (void) Prj_FreeMemProject (&Prj); /***** Show projects again *****/ - Prj_ShowProjectsInCurrentPage (); + Prj_ShowProjects (); } /*****************************************************************************/ @@ -3260,14 +3301,14 @@ void Prj_HideProject (void) Prj_FreeMemProject (&Prj); /***** Show projects again *****/ - Prj_ShowProjectsInCurrentPage (); + Prj_ShowProjects (); } /*****************************************************************************/ -/****************************** Show a project *******************************/ +/****************************** Unhide a project *****************************/ /*****************************************************************************/ -void Prj_ShowProject (void) +void Prj_UnhideProject (void) { struct Project Prj; @@ -3295,7 +3336,7 @@ void Prj_ShowProject (void) Prj_FreeMemProject (&Prj); /***** Show projects again *****/ - Prj_ShowProjectsInCurrentPage (); + Prj_ShowProjects (); } /*****************************************************************************/ @@ -3352,7 +3393,7 @@ static void Prj_RequestCreatOrEditPrj (long PrjCod) Prj_FreeMemProject (&Prj); /***** Show projects again *****/ - Prj_ShowProjectsInCurrentPage (); + Prj_ShowProjects (); } static void Prj_PutFormProject (struct Project *Prj,bool ItsANewProject) @@ -4033,7 +4074,7 @@ void Prj_ReqLockSelectedPrjsEdition (void) Lay_NoPermissionExit (); /***** Show projects again *****/ - Prj_ShowProjectsInCurrentPage (); + Prj_ShowProjects (); } void Prj_ReqUnloSelectedPrjsEdition (void) @@ -4067,7 +4108,7 @@ void Prj_ReqUnloSelectedPrjsEdition (void) Lay_NoPermissionExit (); /***** Show projects again *****/ - Prj_ShowProjectsInCurrentPage (); + Prj_ShowProjects (); } /*****************************************************************************/ @@ -4104,7 +4145,7 @@ void Prj_LockSelectedPrjsEdition (void) Lay_NoPermissionExit (); /***** Show projects again *****/ - Prj_ShowProjectsInCurrentPage (); + Prj_ShowProjects (); } void Prj_UnloSelectedPrjsEdition (void) @@ -4137,7 +4178,7 @@ void Prj_UnloSelectedPrjsEdition (void) Lay_NoPermissionExit (); /***** Show projects again *****/ - Prj_ShowProjectsInCurrentPage (); + Prj_ShowProjects (); } /*****************************************************************************/ diff --git a/swad_project.h b/swad_project.h index 3832d22d..0ee65f57 100644 --- a/swad_project.h +++ b/swad_project.h @@ -207,7 +207,7 @@ long Prj_GetParamPrjCod (void); void Prj_ReqRemProject (void); void Prj_RemoveProject (void); void Prj_HideProject (void); -void Prj_ShowProject (void); +void Prj_UnhideProject (void); void Prj_RecFormProject (void); diff --git a/swad_record.c b/swad_record.c index 5db8b9a6..d3892095 100644 --- a/swad_record.c +++ b/swad_record.c @@ -963,7 +963,7 @@ static void Rec_ListRecordsGsts (Rec_SharedRecordViewType_t TypeOfView) char RecordSectionId[32]; /***** Get list of selected users if not already got *****/ - Usr_GetListsSelectedUsrsCods (); + Usr_GetListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /***** Assign users listing type depending on current action *****/ Gbl.Usrs.Listing.RecsUsrs = Rec_RECORD_USERS_GUESTS; @@ -979,7 +979,7 @@ static void Rec_ListRecordsGsts (Rec_SharedRecordViewType_t TypeOfView) /* Print view */ Frm_StartForm (ActPrnRecSevGst); - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); Rec_ShowLinkToPrintPreviewOfRecords (); Frm_EndForm (); @@ -1035,7 +1035,7 @@ static void Rec_ListRecordsGsts (Rec_SharedRecordViewType_t TypeOfView) Usr_UsrDataDestructor (&UsrDat); /***** Free memory used by list of selected users' codes *****/ - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); } /*****************************************************************************/ @@ -1078,9 +1078,9 @@ static void Rec_ShowRecordOneStdCrs (void) /* Print view */ Frm_StartForm (ActPrnRecSevStd); - Usr_CreateListSelectedUsrsCodsAndFillWithOtherUsr (); - Usr_PutHiddenParSelectedUsrsCods (); - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_CreateListSelectedUsrsCodsAndFillWithOtherUsr (&Gbl.Usrs.Selected); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); Rec_ShowLinkToPrintPreviewOfRecords (); Frm_EndForm (); @@ -1159,7 +1159,7 @@ static void Rec_ListRecordsStds (Rec_SharedRecordViewType_t ShaTypeOfView, char RecordSectionId[32]; /***** Get list of selected users if not already got *****/ - Usr_GetListsSelectedUsrsCods (); + Usr_GetListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /***** Assign users listing type depending on current action *****/ Gbl.Usrs.Listing.RecsUsrs = Rec_RECORD_USERS_STUDENTS; @@ -1182,7 +1182,7 @@ static void Rec_ListRecordsStds (Rec_SharedRecordViewType_t ShaTypeOfView, /* Print view */ Frm_StartForm (ActPrnRecSevStd); - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); Rec_ShowLinkToPrintPreviewOfRecords (); Frm_EndForm (); @@ -1259,7 +1259,7 @@ static void Rec_ListRecordsStds (Rec_SharedRecordViewType_t ShaTypeOfView, Rec_FreeListFields (); /***** Free memory used by list of selected users' codes *****/ - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); } /*****************************************************************************/ @@ -1310,9 +1310,9 @@ static void Rec_ShowRecordOneTchCrs (void) /* Print view */ Frm_StartForm (ActPrnRecSevTch); - Usr_CreateListSelectedUsrsCodsAndFillWithOtherUsr (); - Usr_PutHiddenParSelectedUsrsCods (); - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_CreateListSelectedUsrsCodsAndFillWithOtherUsr (&Gbl.Usrs.Selected); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); Par_PutHiddenParamChar ("ParamOfficeHours",'Y'); Par_PutHiddenParamChar ("ShowOfficeHours",ShowOfficeHours ? 'Y' : 'N'); @@ -1373,7 +1373,7 @@ static void Rec_ListRecordsTchs (Rec_SharedRecordViewType_t TypeOfView) char Width[Cns_MAX_DECIMAL_DIGITS_UINT + 2 + 1]; /***** Get list of selected users if not already got *****/ - Usr_GetListsSelectedUsrsCods (); + Usr_GetListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /***** Width for office hours *****/ snprintf (Width,sizeof (Width), @@ -1400,7 +1400,7 @@ static void Rec_ListRecordsTchs (Rec_SharedRecordViewType_t TypeOfView) /* Print view */ Frm_StartForm (ActPrnRecSevTch); - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); Par_PutHiddenParamChar ("ParamOfficeHours",'Y'); Par_PutHiddenParamChar ("ShowOfficeHours", ShowOfficeHours ? 'Y' : @@ -1474,7 +1474,7 @@ static void Rec_ListRecordsTchs (Rec_SharedRecordViewType_t TypeOfView) Usr_UsrDataDestructor (&UsrDat); /***** Free memory used by list of selected users' codes *****/ - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); } /*****************************************************************************/ @@ -1555,7 +1555,7 @@ static void Rec_PutParamsShowOfficeHoursOneTch (void) static void Rec_PutParamsShowOfficeHoursSeveralTchs (void) { - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); Par_PutHiddenParamChar ("ParamOfficeHours",'Y'); } @@ -1729,7 +1729,7 @@ static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView, Act_GetActCod (ActSeeRecSevStd)); // Original action, used to know where we came from Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod); if (TypeOfView == Rec_CRS_LIST_SEVERAL_RECORDS) - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); } break; default: diff --git a/swad_session.c b/swad_session.c index eb440bb0..e1402816 100644 --- a/swad_session.c +++ b/swad_session.c @@ -403,17 +403,14 @@ static bool Ses_CheckIfHiddenParIsAlreadyInDB (const char *ParamName) /*****************************************************************************/ /***************** Get hidden parameter from the database ********************/ /*****************************************************************************/ -// Return true if the parameter is too big -unsigned Ses_GetHiddenParFromDB (const char *ParamName,char *ParamValue, - size_t MaxBytes) +void Ses_GetHiddenParFromDB (const char *ParamName,char *ParamValue, + size_t MaxBytes) { MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; bool ParameterIsTooBig = false; - unsigned NumTimes = 0; - const char *Ptr; char ErrorTxt[256]; ParamValue[0] = '\0'; @@ -452,12 +449,4 @@ unsigned Ses_GetHiddenParFromDB (const char *ParamName,char *ParamValue, ParamName,(unsigned long) MaxBytes); Lay_ShowErrorAndExit (ErrorTxt); } - - /***** Count number of values of the parameter *****/ - Ptr = ParamValue; - while (*Ptr) - if (Par_GetNextStrUntilSeparParamMult (&Ptr,NULL,MaxBytes)) // Characters found? - NumTimes++; - - return NumTimes; } diff --git a/swad_session.h b/swad_session.h index 82aa5a7a..7a0584fd 100644 --- a/swad_session.h +++ b/swad_session.h @@ -50,7 +50,7 @@ bool Ses_GetSessionData (void); void Ses_InsertHiddenParInDB (const char *ParamName,const char *ParamValue); void Ses_RemoveHiddenParFromThisSession (void); void Ses_RemoveHiddenParFromExpiredSessions (void); -unsigned Ses_GetHiddenParFromDB (const char *ParamName,char *ParamValue, - size_t MaxBytes); +void Ses_GetHiddenParFromDB (const char *ParamName,char *ParamValue, + size_t MaxBytes); #endif diff --git a/swad_statistic.c b/swad_statistic.c index 8275c567..1c233e2a 100644 --- a/swad_statistic.c +++ b/swad_statistic.c @@ -382,9 +382,9 @@ void Sta_AskShowCrsHits (void) HTM_TD_Begin ("colspan=\"2\" class=\"%s LT\"",The_ClassFormInBox[Gbl.Prefs.Theme]); HTM_TABLE_Begin (NULL); - Usr_ListUsersToSelect (Rol_TCH); - Usr_ListUsersToSelect (Rol_NET); - Usr_ListUsersToSelect (Rol_STD); + Usr_ListUsersToSelect (Rol_TCH,&Gbl.Usrs.Selected); + Usr_ListUsersToSelect (Rol_NET,&Gbl.Usrs.Selected); + Usr_ListUsersToSelect (Rol_STD,&Gbl.Usrs.Selected); HTM_TABLE_End (); HTM_TD_End (); @@ -907,7 +907,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse) } /****** Get lists of selected users ******/ - Usr_GetListsSelectedUsrsCods (); + Usr_GetListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /***** Show the form again *****/ Sta_AskShowCrsHits (); @@ -916,11 +916,11 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse) HTM_SECTION_Begin (Sta_STAT_RESULTS_SECTION_ID); /***** Check selection *****/ - if (!Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods ()) // Error: there are no users selected + if (!Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods (&Gbl.Usrs.Selected)) // Error: there are no users selected { /* Write warning message, clean and abort */ Ale_ShowAlert (Ale_WARNING,Txt_You_must_select_one_ore_more_users); - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); return; } break; @@ -1495,7 +1495,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse) /***** Free memory used by list of selected users' codes *****/ if (Gbl.Action.Act == ActSeeAccCrs) - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /***** Write time zone used in the calculation of these statistics *****/ switch (Gbl.Stat.ClicksGroupedBy) @@ -1609,7 +1609,7 @@ static void Sta_ShowDetailedAccessesList (unsigned long NumRows,MYSQL_RES *mysql Par_PutHiddenParamLong (NULL,"FirstRow",FirstRow - Gbl.Stat.RowsPerPage); Par_PutHiddenParamLong (NULL,"LastRow" ,FirstRow - 1); Par_PutHiddenParamUnsigned (NULL,"RowsPage",Gbl.Stat.RowsPerPage); - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); } HTM_TD_Begin ("class=\"LM\""); if (FirstRow > 1) @@ -1647,7 +1647,7 @@ static void Sta_ShowDetailedAccessesList (unsigned long NumRows,MYSQL_RES *mysql Par_PutHiddenParamUnsigned (NULL,"FirstRow" ,(unsigned) (LastRow + 1)); Par_PutHiddenParamUnsigned (NULL,"LastRow" ,(unsigned) (LastRow + Gbl.Stat.RowsPerPage)); Par_PutHiddenParamUnsigned (NULL,"RowsPage" ,(unsigned) Gbl.Stat.RowsPerPage); - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); } HTM_TD_Begin ("class=\"RM\""); if (LastRow < NumRows) @@ -2074,7 +2074,7 @@ static void Sta_ShowDistrAccessesPerDayAndHour (unsigned long NumRows,MYSQL_RES Par_PutHiddenParamUnsigned (NULL,"CountType",(unsigned) Gbl.Stat.CountType); Par_PutHiddenParamUnsigned (NULL,"StatAct" ,(unsigned) Gbl.Stat.NumAction); if (Gbl.Action.Act == ActSeeAccCrs) - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); else // Gbl.Action.Act == ActSeeAccGbl { Par_PutHiddenParamUnsigned (NULL,"Role",(unsigned) Gbl.Stat.Role); diff --git a/swad_test.c b/swad_test.c index a5b007fc..27df48d8 100644 --- a/swad_test.c +++ b/swad_test.c @@ -7497,9 +7497,9 @@ void Tst_SelUsrsToViewUsrsTstResults (void) HTM_TD_Begin ("colspan=\"2\" class=\"%s LT\"",The_ClassFormInBox[Gbl.Prefs.Theme]); HTM_TABLE_BeginPadding (2); - Usr_ListUsersToSelect (Rol_TCH); - Usr_ListUsersToSelect (Rol_NET); - Usr_ListUsersToSelect (Rol_STD); + Usr_ListUsersToSelect (Rol_TCH,&Gbl.Usrs.Selected); + Usr_ListUsersToSelect (Rol_NET,&Gbl.Usrs.Selected); + Usr_ListUsersToSelect (Rol_STD,&Gbl.Usrs.Selected); HTM_TABLE_End (); HTM_TD_End (); @@ -7533,7 +7533,7 @@ void Tst_SelUsrsToViewUsrsTstResults (void) Usr_FreeUsrsList (Rol_STD); /***** Free memory used by list of selected users' codes *****/ - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /***** Free memory for list of selected groups *****/ Grp_FreeListCodSelectedGrps (); @@ -7635,7 +7635,8 @@ static void Tst_StoreScoreOfTestResultInDB (long TstCod, void Tst_GetUsrsAndShowTstResults (void) { - Usr_GetSelectedUsrsAndGoToAct (Tst_ShowUsrsTstResults, + Usr_GetSelectedUsrsAndGoToAct (&Gbl.Usrs.Selected, + Tst_ShowUsrsTstResults, Tst_SelUsrsToViewUsrsTstResults); } diff --git a/swad_user.c b/swad_user.c index d9e428ff..6804cf5f 100644 --- a/swad_user.c +++ b/swad_user.c @@ -25,10 +25,12 @@ /*********************************** Headers *********************************/ /*****************************************************************************/ +#define _GNU_SOURCE // For asprintf #include // For isalnum, isdigit, etc. #include // For maximum values #include // For PATH_MAX #include // For NULL +#include // For asprintf #include // For exit, system, malloc, free, rand, etc. #include // For string functions #include // For the macro WEXITSTATUS @@ -205,23 +207,31 @@ static void Usr_PutButtonToConfirmIWantToSeeBigList (unsigned NumUsrs, const char *OnSubmit); static void Usr_PutParamsConfirmIWantToSeeBigList (void); -static void Usr_AllocateListSelectedEncryptedUsrCods (Rol_Role_t Role); +static void Usr_BuildParamName (char **ParamName, + const char *ParamRoot, + struct SelectedUsrs *SelectedUsrs); + +static void Usr_AllocateListSelectedEncryptedUsrCods (struct SelectedUsrs *SelectedUsrs, + Rol_Role_t Role); static void Usr_AllocateListOtherRecipients (void); static void Usr_FormToSelectUsrListType (void (*FuncParams) (void), Usr_ShowUsrsType_t ListType); - +static void Usr_PutCheckboxToSelectAllUsers (Rol_Role_t Role, + struct SelectedUsrs *SelectedUsrs); static Usr_Sex_t Usr_GetSexOfUsrsLst (Rol_Role_t Role); - static void Usr_PutCheckboxToSelectUser (Rol_Role_t Role, const char *EncryptedUsrCod, - bool UsrIsTheMsgSender); + bool UsrIsTheMsgSender, + struct SelectedUsrs *SelectedUsrs); static void Usr_PutCheckboxListWithPhotos (void); static void Usr_ListMainDataGsts (bool PutCheckBoxToSelectUsr); static void Usr_ListMainDataStds (bool PutCheckBoxToSelectUsr); -static void Usr_ListMainDataTchs (Rol_Role_t Role,bool PutCheckBoxToSelectUsr); -static void Usr_ListUsrsForSelection (Rol_Role_t Role); +static void Usr_ListMainDataTchs (Rol_Role_t Role, + bool PutCheckBoxToSelectUsr); +static void Usr_ListUsrsForSelection (Rol_Role_t Role, + struct SelectedUsrs *SelectedUsrs); static void Usr_ListRowsAllDataTchs (Rol_Role_t Role, const char *FieldNames[Usr_NUM_ALL_FIELDS_DATA_TCH], unsigned NumColumns); @@ -263,7 +273,9 @@ static void Usr_ShowStdsAllDataParams (void); static void Usr_ShowTchsAllDataParams (void); static void Usr_DrawClassPhoto (Usr_ClassPhotoType_t ClassPhotoType, - Rol_Role_t Role,bool PutCheckBoxToSelectUsr); + Rol_Role_t Role, + struct SelectedUsrs *SelectedUsrs, + bool PutCheckBoxToSelectUsr); /*****************************************************************************/ /**** Show alert about number of clicks remaining before sending my photo ****/ @@ -3607,7 +3619,8 @@ static void Usr_InsertMyLastData (void) #define Usr_MAX_BYTES_BG_COLOR (16 - 1) void Usr_WriteRowUsrMainData (unsigned NumUsr,struct UsrData *UsrDat, - bool PutCheckBoxToSelectUsr,Rol_Role_t Role) + bool PutCheckBoxToSelectUsr,Rol_Role_t Role, + struct SelectedUsrs *SelectedUsrs) { extern const char *Txt_Enrolment_confirmed; extern const char *Txt_Enrolment_not_confirmed; @@ -3634,7 +3647,8 @@ void Usr_WriteRowUsrMainData (unsigned NumUsr,struct UsrData *UsrDat, if (PutCheckBoxToSelectUsr) { HTM_TD_Begin ("class=\"CM %s\"",BgColor); - Usr_PutCheckboxToSelectUser (Role,UsrDat->EncryptedUsrCod,UsrIsTheMsgSender); + Usr_PutCheckboxToSelectUser (Role,UsrDat->EncryptedUsrCod,UsrIsTheMsgSender, + SelectedUsrs); HTM_TD_End (); } @@ -5675,63 +5689,80 @@ static void Usr_PutParamsConfirmIWantToSeeBigList (void) Par_PutHiddenParamChar ("ShowBigList",'Y'); } +/*****************************************************************************/ +/************ Create list of selected users with one given user **************/ +/*****************************************************************************/ + +void Usr_CreateListSelectedUsrsCodsAndFillWithOtherUsr (struct SelectedUsrs *SelectedUsrs) + { + /***** Create list of user codes and put encrypted user code in it *****/ + if (!SelectedUsrs->List[Rol_UNK]) + { + if ((SelectedUsrs->List[Rol_UNK] = + (char *) malloc (Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 1)) == NULL) + Lay_NotEnoughMemoryExit (); + Str_Copy (SelectedUsrs->List[Rol_UNK],Gbl.Usrs.Other.UsrDat.EncryptedUsrCod, + Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64); + SelectedUsrs->Filled = true; + } + } + /*****************************************************************************/ /************* Write parameter with the list of users selected ***************/ /*****************************************************************************/ -void Usr_PutHiddenParSelectedUsrsCods (void) +void Usr_PutHiddenParSelectedUsrsCods (struct SelectedUsrs *SelectedUsrs) { + char *ParamName; + /***** Put a parameter indicating that a list of several users is present *****/ Par_PutHiddenParamChar ("MultiUsrs",'Y'); /***** Put a parameter with the encrypted user codes of several users *****/ + /* Build name of the parameter. + Sometimes a unique action needs several distinct lists of users, + so, it's necessary to use distinct names for the parameters. */ + Usr_BuildParamName (&ParamName,Usr_ParamUsrCod[Rol_UNK],SelectedUsrs); + + /* Put the parameter *****/ if (Gbl.Session.IsOpen) - Ses_InsertHiddenParInDB (Usr_ParamUsrCod[Rol_UNK],Gbl.Usrs.Selected.List[Rol_UNK]); + Ses_InsertHiddenParInDB (ParamName,SelectedUsrs->List[Rol_UNK]); else - Par_PutHiddenParamString (NULL,Usr_ParamUsrCod[Rol_UNK],Gbl.Usrs.Selected.List[Rol_UNK]); - } + Par_PutHiddenParamString (NULL,ParamName,SelectedUsrs->List[Rol_UNK]); -/*****************************************************************************/ -/**************** Create list of selected users with one given user ************************/ -/*****************************************************************************/ - -void Usr_CreateListSelectedUsrsCodsAndFillWithOtherUsr (void) - { - /***** Create list of user codes and put encrypted user code in it *****/ - if (!Gbl.Usrs.Selected.List[Rol_UNK]) - { - if ((Gbl.Usrs.Selected.List[Rol_UNK] = - (char *) malloc (Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 1)) == NULL) - Lay_NotEnoughMemoryExit (); - Str_Copy (Gbl.Usrs.Selected.List[Rol_UNK],Gbl.Usrs.Other.UsrDat.EncryptedUsrCod, - Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64); - Gbl.Usrs.Selected.Filled = true; - } + /***** Free allocated memory for parameter name *****/ + free (ParamName); } /*****************************************************************************/ /************************* Get list of selected users ************************/ /*****************************************************************************/ -void Usr_GetListsSelectedUsrsCods (void) +void Usr_GetListsSelectedEncryptedUsrsCods (struct SelectedUsrs *SelectedUsrs) { extern const char *Par_SEPARATOR_PARAM_MULTIPLE; + char *ParamName; unsigned Length; Rol_Role_t Role; - if (!Gbl.Usrs.Selected.Filled) // Get list only if not already got + if (!SelectedUsrs->Filled) // Get list only if not already got { + /***** Build name of the parameter. + Sometimes a unique action needs several distinct lists of users, + so, it's necessary to use distinct names for the parameters. *****/ + Usr_BuildParamName (&ParamName,Usr_ParamUsrCod[Rol_UNK],SelectedUsrs); + /***** Get possible list of all selected users *****/ - Usr_AllocateListSelectedEncryptedUsrCods (Rol_UNK); + Usr_AllocateListSelectedEncryptedUsrCods (SelectedUsrs,Rol_UNK); if (Gbl.Session.IsOpen) // If the session is open, get parameter from DB { - Ses_GetHiddenParFromDB (Usr_ParamUsrCod[Rol_UNK],Gbl.Usrs.Selected.List[Rol_UNK], + Ses_GetHiddenParFromDB (ParamName,SelectedUsrs->List[Rol_UNK], Usr_MAX_BYTES_LIST_ENCRYPTED_USR_CODS); - Str_ChangeFormat (Str_FROM_FORM,Str_TO_TEXT,Gbl.Usrs.Selected.List[Rol_UNK], + Str_ChangeFormat (Str_FROM_FORM,Str_TO_TEXT,SelectedUsrs->List[Rol_UNK], Usr_MAX_BYTES_LIST_ENCRYPTED_USR_CODS,true); } else - Par_GetParMultiToText (Usr_ParamUsrCod[Rol_UNK],Gbl.Usrs.Selected.List[Rol_UNK], + Par_GetParMultiToText (ParamName,SelectedUsrs->List[Rol_UNK], Usr_MAX_BYTES_LIST_ENCRYPTED_USR_CODS); /***** Get list of selected users for each possible role *****/ @@ -5741,28 +5772,50 @@ void Usr_GetListsSelectedUsrsCods (void) if (Usr_ParamUsrCod[Role]) { /* Get parameter with selected users with this role */ - Usr_AllocateListSelectedEncryptedUsrCods (Role); - Par_GetParMultiToText (Usr_ParamUsrCod[Role],Gbl.Usrs.Selected.List[Role], + Usr_AllocateListSelectedEncryptedUsrCods (SelectedUsrs,Role); + Par_GetParMultiToText (Usr_ParamUsrCod[Role],SelectedUsrs->List[Role], Usr_MAX_BYTES_LIST_ENCRYPTED_USR_CODS); /* Add selected users with this role to the list with all selected users */ - if (Gbl.Usrs.Selected.List[Role][0]) + if (SelectedUsrs->List[Role][0]) { - if (Gbl.Usrs.Selected.List[Rol_UNK][0]) - if ((Length = strlen (Gbl.Usrs.Selected.List[Rol_UNK])) < + if (SelectedUsrs->List[Rol_UNK][0]) + if ((Length = strlen (SelectedUsrs->List[Rol_UNK])) < Usr_MAX_BYTES_LIST_ENCRYPTED_USR_CODS) { - Gbl.Usrs.Selected.List[Rol_UNK][Length ] = Par_SEPARATOR_PARAM_MULTIPLE[0]; - Gbl.Usrs.Selected.List[Rol_UNK][Length + 1] = '\0'; + SelectedUsrs->List[Rol_UNK][Length ] = Par_SEPARATOR_PARAM_MULTIPLE[0]; + SelectedUsrs->List[Rol_UNK][Length + 1] = '\0'; } - Str_Concat (Gbl.Usrs.Selected.List[Rol_UNK],Gbl.Usrs.Selected.List[Role], + Str_Concat (SelectedUsrs->List[Rol_UNK],SelectedUsrs->List[Role], Usr_MAX_BYTES_LIST_ENCRYPTED_USR_CODS); } } + /***** Free allocated memory for parameter name *****/ + free (ParamName); + /***** List is filled *****/ - Gbl.Usrs.Selected.Filled = true; + SelectedUsrs->Filled = true; + } + } + +static void Usr_BuildParamName (char **ParamName, + const char *ParamRoot, + struct SelectedUsrs *SelectedUsrs) + { + /* Build name of the parameter. + Sometimes a unique action needs several distinct lists of users, + so, it's necessary to use distinct names for the parameters. */ + if (SelectedUsrs->ParamSuffix) + { + if (asprintf (ParamName,"%s%s",ParamRoot,SelectedUsrs->ParamSuffix) < 0) + Lay_NotEnoughMemoryExit (); + } + else + { + if (asprintf (ParamName,"%s",ParamRoot) < 0) + Lay_NotEnoughMemoryExit (); } } @@ -5789,7 +5842,7 @@ bool Usr_GetListMsgRecipientsWrittenExplicitelyBySender (bool WriteErrorMsgs) /***** Get list of selected encrypted users's codes if not already got. This list is necessary to add encrypted user's codes at the end. *****/ - Usr_GetListsSelectedUsrsCods (); + Usr_GetListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); LengthSelectedUsrsCods = strlen (Gbl.Usrs.Selected.List[Rol_UNK]); /***** Allocate memory for the lists of recipients written explicetely *****/ @@ -5973,14 +6026,13 @@ bool Usr_FindEncryptedUsrCodsInListOfSelectedEncryptedUsrCods (const char *Encry /******* Check if there are valid users in list of encrypted user codes ******/ /*****************************************************************************/ -bool Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods (void) +bool Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods (struct SelectedUsrs *SelectedUsrs) { const char *Ptr; struct UsrData UsrDat; - /***** Loop over the list Gbl.Usrs.Selected.List[Rol_UNK] - to check if there are valid users *****/ - Ptr = Gbl.Usrs.Selected.List[Rol_UNK]; + /***** Loop over the list to check if there are valid users *****/ + Ptr = SelectedUsrs->List[Rol_UNK]; while (*Ptr) { Par_GetNextStrUntilSeparParamMult (&Ptr,UsrDat.EncryptedUsrCod, @@ -5996,15 +6048,14 @@ bool Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods (void) /******** Count number of valid users in list of encrypted user codes ********/ /*****************************************************************************/ -unsigned Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods (void) +unsigned Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods (struct SelectedUsrs *SelectedUsrs) { const char *Ptr; unsigned NumUsrs = 0; struct UsrData UsrDat; - /***** Loop over the list Gbl.Usrs.Selected.List[Rol_UNK] - to count the number of users *****/ - Ptr = Gbl.Usrs.Selected.List[Rol_UNK]; + /***** Loop over the list to count the number of users *****/ + Ptr = SelectedUsrs->List[Rol_UNK]; while (*Ptr) { Par_GetNextStrUntilSeparParamMult (&Ptr,UsrDat.EncryptedUsrCod, @@ -6021,13 +6072,15 @@ unsigned Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods (void) /*****************************************************************************/ // Role = Rol_UNK here means all users -static void Usr_AllocateListSelectedEncryptedUsrCods (Rol_Role_t Role) +static void Usr_AllocateListSelectedEncryptedUsrCods (struct SelectedUsrs *SelectedUsrs, + Rol_Role_t Role) { - if (!Gbl.Usrs.Selected.List[Role]) + if (!SelectedUsrs->List[Role]) { - if ((Gbl.Usrs.Selected.List[Role] = (char *) malloc (Usr_MAX_BYTES_LIST_ENCRYPTED_USR_CODS + 1)) == NULL) + if ((SelectedUsrs->List[Role] = + (char *) malloc (Usr_MAX_BYTES_LIST_ENCRYPTED_USR_CODS + 1)) == NULL) Lay_NotEnoughMemoryExit (); - Gbl.Usrs.Selected.List[Role][0] = '\0'; + SelectedUsrs->List[Role][0] = '\0'; } } @@ -6036,24 +6089,24 @@ static void Usr_AllocateListSelectedEncryptedUsrCods (Rol_Role_t Role) /*****************************************************************************/ // Role = Rol_UNK here means all users -void Usr_FreeListsSelectedEncryptedUsrsCods (void) +void Usr_FreeListsSelectedEncryptedUsrsCods (struct SelectedUsrs *SelectedUsrs) { Rol_Role_t Role; - if (Gbl.Usrs.Selected.Filled) // Only if lists are filled + if (SelectedUsrs->Filled) // Only if lists are filled { /***** Free lists *****/ for (Role = (Rol_Role_t) 0; Role < Rol_NUM_ROLES; Role++) - if (Gbl.Usrs.Selected.List[Role]) + if (SelectedUsrs->List[Role]) { - free (Gbl.Usrs.Selected.List[Role]); - Gbl.Usrs.Selected.List[Role] = NULL; + free (SelectedUsrs->List[Role]); + SelectedUsrs->List[Role] = NULL; } /***** Mark lists as empty *****/ - Gbl.Usrs.Selected.Filled = false; + SelectedUsrs->Filled = false; // Lists of encrypted codes of users selected from form // are now marked as not filled } @@ -6063,7 +6116,9 @@ void Usr_FreeListsSelectedEncryptedUsrsCods (void) /************* Get list of users selected to show their projects *************/ /*****************************************************************************/ -void Usr_GetListSelectedUsrCods (unsigned NumUsrsInList,long **LstSelectedUsrCods) +void Usr_GetListSelectedUsrCods (struct SelectedUsrs *SelectedUsrs, + unsigned NumUsrsInList, + long **LstSelectedUsrCods) { unsigned NumUsr; const char *Ptr; @@ -6076,8 +6131,8 @@ void Usr_GetListSelectedUsrCods (unsigned NumUsrsInList,long **LstSelectedUsrCod /***** Initialize structure with user's data *****/ Usr_UsrDataConstructor (&UsrDat); - /***** Loop over the list Gbl.Usrs.Selected.List[Rol_UNK] getting users' codes *****/ - for (NumUsr = 0, Ptr = Gbl.Usrs.Selected.List[Rol_UNK]; + /***** Loop over the list getting users' codes *****/ + for (NumUsr = 0, Ptr = SelectedUsrs->List[Rol_UNK]; NumUsr < NumUsrsInList && *Ptr; NumUsr++) { @@ -6250,7 +6305,8 @@ static void Usr_FormToSelectUsrListType (void (*FuncParams) (void), /******************** List users to select some of them **********************/ /*****************************************************************************/ -void Usr_PutFormToSelectUsrsToGoToAct (Act_Action_t NextAction,void (*FuncParams) (), +void Usr_PutFormToSelectUsrsToGoToAct (struct SelectedUsrs *SelectedUsrs, + Act_Action_t NextAction,void (*FuncParams) (), const char *Title, const char *HelpLink, const char *TxtButton) @@ -6313,9 +6369,9 @@ void Usr_PutFormToSelectUsrsToGoToAct (Act_Action_t NextAction,void (*FuncParams /* Put list of users to select some of them */ HTM_TABLE_BeginCenter (); - Usr_ListUsersToSelect (Rol_TCH); - Usr_ListUsersToSelect (Rol_NET); - Usr_ListUsersToSelect (Rol_STD); + Usr_ListUsersToSelect (Rol_TCH,SelectedUsrs); + Usr_ListUsersToSelect (Rol_NET,SelectedUsrs); + Usr_ListUsersToSelect (Rol_STD,SelectedUsrs); HTM_TABLE_End (); /* Send button */ @@ -6347,16 +6403,20 @@ void Usr_PutFormToSelectUsrsToGoToAct (Act_Action_t NextAction,void (*FuncParams Box_BoxEnd (); } -void Usr_GetSelectedUsrsAndGoToAct (void (*FuncWhenUsrsSelected) (), +void Usr_GetSelectedUsrsAndGoToAct (struct SelectedUsrs *SelectedUsrs, + void (*FuncWhenUsrsSelected) (), void (*FuncWhenNoUsrsSelected) ()) { extern const char *Txt_You_must_select_one_ore_more_users; /***** Get lists of the selected users if not already got *****/ - Usr_GetListsSelectedUsrsCods (); + Usr_GetListsSelectedEncryptedUsrsCods (SelectedUsrs); + Ale_ShowAlert (Ale_INFO,"DEBUG: SelectedUsrs->List[Rol_UNK] = %s;", + SelectedUsrs->List[Rol_UNK]); + Lay_ShowErrorAndExit ("DEBUG: Usr_GetSelectedUsrsAndGoToAct ()"); /***** Check number of users *****/ - if (Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods ()) // If some users are selected... + if (Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods (SelectedUsrs)) // If some users are selected... FuncWhenUsrsSelected (); else // If no users are selected... { @@ -6367,14 +6427,14 @@ void Usr_GetSelectedUsrsAndGoToAct (void (*FuncWhenUsrsSelected) (), } /***** Free memory used by list of selected users' codes *****/ - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (SelectedUsrs); } /*****************************************************************************/ /*********** List users with a given role to select some of them *************/ /*****************************************************************************/ -void Usr_ListUsersToSelect (Rol_Role_t Role) +void Usr_ListUsersToSelect (Rol_Role_t Role,struct SelectedUsrs *SelectedUsrs) { /***** If there are no users, don't list anything *****/ if (!Gbl.Usrs.LstUsrs[Role].NumUsrs) @@ -6385,10 +6445,10 @@ void Usr_ListUsersToSelect (Rol_Role_t Role) { case Usr_LIST_AS_CLASS_PHOTO: Usr_DrawClassPhoto (Usr_CLASS_PHOTO_SEL, - Role,true); + Role,SelectedUsrs,true); break; case Usr_LIST_AS_LISTING: - Usr_ListUsrsForSelection (Role); + Usr_ListUsrsForSelection (Role,SelectedUsrs); break; default: break; @@ -6399,10 +6459,12 @@ void Usr_ListUsersToSelect (Rol_Role_t Role) /******** Put a row, in a classphoto or a list, to select all users **********/ /*****************************************************************************/ -void Usr_PutCheckboxToSelectAllUsers (Rol_Role_t Role) +static void Usr_PutCheckboxToSelectAllUsers (Rol_Role_t Role, + struct SelectedUsrs *SelectedUsrs) { extern const char *Txt_ROLES_SINGUL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; + char *ParamName; Usr_Sex_t Sex; HTM_TR_Begin (NULL); @@ -6411,9 +6473,13 @@ void Usr_PutCheckboxToSelectAllUsers (Rol_Role_t Role) HTM_LABEL_Begin (NULL); if (Usr_NameSelUnsel[Role] && Usr_ParamUsrCod[Role]) + { + Usr_BuildParamName (&ParamName,Usr_ParamUsrCod[Role],SelectedUsrs); HTM_INPUT_CHECKBOX (Usr_NameSelUnsel[Role],false, "value=\"\" onclick=\"togglecheckChildren(this,'%s')\"", - Usr_ParamUsrCod[Role]); + ParamName); + free (ParamName); + } else Rol_WrongRoleExit (); Sex = Usr_GetSexOfUsrsLst (Role); @@ -6469,9 +6535,11 @@ unsigned Usr_GetColumnsForSelectUsrs (void) static void Usr_PutCheckboxToSelectUser (Rol_Role_t Role, const char *EncryptedUsrCod, - bool UsrIsTheMsgSender) + bool UsrIsTheMsgSender, + struct SelectedUsrs *SelectedUsrs) { bool CheckboxChecked; + char *ParamName; if (Usr_NameSelUnsel[Role] && Usr_ParamUsrCod[Role]) { @@ -6483,11 +6551,13 @@ static void Usr_PutCheckboxToSelectUser (Rol_Role_t Role, CheckboxChecked = Usr_FindEncryptedUsrCodsInListOfSelectedEncryptedUsrCods (EncryptedUsrCod); /***** Check box *****/ - HTM_INPUT_CHECKBOX (Usr_ParamUsrCod[Role],false, + Usr_BuildParamName (&ParamName,Usr_ParamUsrCod[Role],SelectedUsrs); + HTM_INPUT_CHECKBOX (ParamName,false, "value=\"%s\"%s onclick=\"checkParent(this,'%s')\"", EncryptedUsrCod, CheckboxChecked ? " checked=\"checked\"" : "", Usr_NameSelUnsel[Role]); + free (ParamName); } else Rol_WrongRoleExit (); @@ -6578,7 +6648,7 @@ static void Usr_ListMainDataGsts (bool PutCheckBoxToSelectUsr) /***** Put a row to select all users *****/ if (PutCheckBoxToSelectUsr) - Usr_PutCheckboxToSelectAllUsers (Rol_GST); + Usr_PutCheckboxToSelectAllUsers (Rol_GST,&Gbl.Usrs.Selected); /***** Heading row with column names *****/ Usr_WriteHeaderFieldsUsrDat (PutCheckBoxToSelectUsr); // Columns for the data @@ -6598,7 +6668,8 @@ static void Usr_ListMainDataGsts (bool PutCheckBoxToSelectUsr) ID_GetListIDsFromUsrCod (&UsrDat); /* Show row for this guest */ - Usr_WriteRowUsrMainData (NumUsr + 1,&UsrDat,true,Rol_GST); + Usr_WriteRowUsrMainData (NumUsr + 1,&UsrDat,true,Rol_GST, + &Gbl.Usrs.Selected); } /***** Free memory used for user's data *****/ @@ -6647,7 +6718,7 @@ static void Usr_ListMainDataStds (bool PutCheckBoxToSelectUsr) /***** Put a row to select all users *****/ if (PutCheckBoxToSelectUsr) - Usr_PutCheckboxToSelectAllUsers (Rol_STD); + Usr_PutCheckboxToSelectAllUsers (Rol_STD,&Gbl.Usrs.Selected); /***** Heading row with column names *****/ Usr_WriteHeaderFieldsUsrDat (PutCheckBoxToSelectUsr); // Columns for the data @@ -6668,7 +6739,8 @@ static void Usr_ListMainDataStds (bool PutCheckBoxToSelectUsr) /* Show row for this student */ Usr_WriteRowUsrMainData (NumUsr + 1,&UsrDat, - PutCheckBoxToSelectUsr,Rol_STD); + PutCheckBoxToSelectUsr,Rol_STD, + &Gbl.Usrs.Selected); } /***** Free memory used for user's data *****/ @@ -6692,7 +6764,8 @@ static void Usr_ListMainDataStds (bool PutCheckBoxToSelectUsr) // - Rol_NET // - Rol_TCH -static void Usr_ListMainDataTchs (Rol_Role_t Role,bool PutCheckBoxToSelectUsr) +static void Usr_ListMainDataTchs (Rol_Role_t Role, + bool PutCheckBoxToSelectUsr) { unsigned NumCol; unsigned NumUsr; @@ -6702,7 +6775,7 @@ static void Usr_ListMainDataTchs (Rol_Role_t Role,bool PutCheckBoxToSelectUsr) { /***** Put a row to select all users *****/ if (PutCheckBoxToSelectUsr) - Usr_PutCheckboxToSelectAllUsers (Role); + Usr_PutCheckboxToSelectAllUsers (Role,&Gbl.Usrs.Selected); /***** Heading row with column names *****/ /* Start row */ @@ -6738,7 +6811,8 @@ static void Usr_ListMainDataTchs (Rol_Role_t Role,bool PutCheckBoxToSelectUsr) /* Show row for this teacher */ Usr_WriteRowUsrMainData (NumUsr + 1,&UsrDat, - PutCheckBoxToSelectUsr,Role); + PutCheckBoxToSelectUsr,Role, + &Gbl.Usrs.Selected); } /***** Free memory used for user's data *****/ @@ -7071,7 +7145,8 @@ void Usr_ListAllDataStds (void) /*************** List users (of current course) for selection ****************/ /*****************************************************************************/ -static void Usr_ListUsrsForSelection (Rol_Role_t Role) +static void Usr_ListUsrsForSelection (Rol_Role_t Role, + struct SelectedUsrs *SelectedUsrs) { unsigned NumUsr; struct UsrData UsrDat; @@ -7082,7 +7157,7 @@ static void Usr_ListUsrsForSelection (Rol_Role_t Role) Usr_SetUsrDatMainFieldNames (); /***** Put a row to select all users *****/ - Usr_PutCheckboxToSelectAllUsers (Role); + Usr_PutCheckboxToSelectAllUsers (Role,SelectedUsrs); /***** Heading row with column names *****/ Usr_WriteHeaderFieldsUsrDat (true); // Columns for the data @@ -7098,7 +7173,7 @@ static void Usr_ListUsrsForSelection (Rol_Role_t Role) if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat,Usr_DONT_GET_PREFS)) // If user's data exist... { UsrDat.Accepted = Gbl.Usrs.LstUsrs[Role].Lst[NumUsr].Accepted; - Usr_WriteRowUsrMainData (++NumUsr,&UsrDat,true,Role); + Usr_WriteRowUsrMainData (++NumUsr,&UsrDat,true,Role,SelectedUsrs); Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd; } @@ -7303,7 +7378,8 @@ unsigned Usr_ListUsrsFound (Rol_Role_t Role, ID_GetListIDsFromUsrCod (&UsrDat); /* Write data of this user */ - Usr_WriteRowUsrMainData (NumUsr + 1,&UsrDat,false,Role); + Usr_WriteRowUsrMainData (NumUsr + 1,&UsrDat,false,Role, + &Gbl.Usrs.Selected); /* Write all the courses this user belongs to */ if (Role != Rol_GST && // Guests do not belong to any course @@ -7940,7 +8016,7 @@ void Usr_SeeGuests (void) { case Usr_LIST_AS_CLASS_PHOTO: Usr_DrawClassPhoto (Usr_CLASS_PHOTO_SEL_SEE, - Rol_GST, + Rol_GST,&Gbl.Usrs.Selected, PutForm); // Put checkbox to select users? break; case Usr_LIST_AS_LISTING: @@ -8101,7 +8177,7 @@ void Usr_SeeStudents (void) { case Usr_LIST_AS_CLASS_PHOTO: Usr_DrawClassPhoto (Usr_CLASS_PHOTO_SEL_SEE, - Rol_STD, + Rol_STD,&Gbl.Usrs.Selected, PutForm); // Put checkbox to select users? break; case Usr_LIST_AS_LISTING: @@ -8271,10 +8347,10 @@ void Usr_SeeTeachers (void) case Usr_LIST_AS_CLASS_PHOTO: /* List teachers and non-editing teachers */ Usr_DrawClassPhoto (Usr_CLASS_PHOTO_SEL_SEE, - Rol_TCH, + Rol_TCH,&Gbl.Usrs.Selected, PutForm); // Put checkbox to select users? Usr_DrawClassPhoto (Usr_CLASS_PHOTO_SEL_SEE, - Rol_NET, + Rol_NET,&Gbl.Usrs.Selected, PutForm); // Put checkbox to select users? break; case Usr_LIST_AS_LISTING: @@ -8470,10 +8546,10 @@ void Usr_DoActionOnSeveralUsrs1 (void) /***** Get parameters from form *****/ /* Get list of selected users */ - Usr_GetListsSelectedUsrsCods (); + Usr_GetListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); /* Check if there are selected users */ - if (Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods ()) + if (Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods (&Gbl.Usrs.Selected)) { /* Get the action to do */ Gbl.Usrs.Selected.Option = Usr_GetListUsrsOption (Usr_OPTION_UNKNOWN); @@ -8605,7 +8681,7 @@ void Usr_DoActionOnSeveralUsrs2 (void) } /***** Free memory used by list of selected users' codes *****/ - Usr_FreeListsSelectedEncryptedUsrsCods (); + Usr_FreeListsSelectedEncryptedUsrsCods (&Gbl.Usrs.Selected); } /*****************************************************************************/ @@ -8793,7 +8869,7 @@ void Usr_SeeGstClassPhotoPrn (void) -1L,-1L); HTM_TABLE_BeginWide (); Usr_DrawClassPhoto (Usr_CLASS_PHOTO_PRN, - Rol_GST,false); + Rol_GST,&Gbl.Usrs.Selected,false); HTM_TABLE_End (); } else // Gbl.Usrs.LstUsrs[Rol_GST].NumUsrs @@ -8841,7 +8917,7 @@ void Usr_SeeStdClassPhotoPrn (void) -1L); HTM_TABLE_BeginWide (); Usr_DrawClassPhoto (Usr_CLASS_PHOTO_PRN, - Rol_STD,false); + Rol_STD,&Gbl.Usrs.Selected,false); HTM_TABLE_End (); } else // Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs == 0 @@ -8910,9 +8986,9 @@ void Usr_SeeTchClassPhotoPrn (void) /* List teachers and non-editing teachers */ Usr_DrawClassPhoto (Usr_CLASS_PHOTO_PRN, - Rol_TCH,false); + Rol_TCH,&Gbl.Usrs.Selected,false); Usr_DrawClassPhoto (Usr_CLASS_PHOTO_PRN, - Rol_NET,false); + Rol_NET,&Gbl.Usrs.Selected,false); HTM_TABLE_End (); } @@ -8933,7 +9009,9 @@ void Usr_SeeTchClassPhotoPrn (void) /*****************************************************************************/ static void Usr_DrawClassPhoto (Usr_ClassPhotoType_t ClassPhotoType, - Rol_Role_t Role,bool PutCheckBoxToSelectUsr) + Rol_Role_t Role, + struct SelectedUsrs *SelectedUsrs, + bool PutCheckBoxToSelectUsr) { unsigned NumUsr; bool TRIsOpen = false; @@ -8961,7 +9039,7 @@ static void Usr_DrawClassPhoto (Usr_ClassPhotoType_t ClassPhotoType, /***** Put a row to select all users *****/ if (PutCheckBoxToSelectUsr) - Usr_PutCheckboxToSelectAllUsers (Role); + Usr_PutCheckboxToSelectAllUsers (Role,SelectedUsrs); /***** Initialize structure with user's data *****/ Usr_UsrDataConstructor (&UsrDat); @@ -8997,7 +9075,8 @@ static void Usr_DrawClassPhoto (Usr_ClassPhotoType_t ClassPhotoType, /***** Checkbox to select this user *****/ if (PutCheckBoxToSelectUsr) - Usr_PutCheckboxToSelectUser (Role,UsrDat.EncryptedUsrCod,UsrIsTheMsgSender); + Usr_PutCheckboxToSelectUser (Role,UsrDat.EncryptedUsrCod,UsrIsTheMsgSender, + SelectedUsrs); /***** Show photo *****/ ShowPhoto = Pho_ShowingUsrPhotoIsAllowed (&UsrDat,PhotoURL); diff --git a/swad_user.h b/swad_user.h index da672bc3..8f1051b0 100644 --- a/swad_user.h +++ b/swad_user.h @@ -264,6 +264,14 @@ struct ListUsrs unsigned NumUsrs; // Number of users in the list }; +struct SelectedUsrs + { + char *List[Rol_NUM_ROLES]; // Lists of encrypted codes of users selected from a form + bool Filled; // If lists are already filled/readed + char *ParamSuffix; + Usr_ListUsrsOption_t Option; // What option I have selected to do with these selected users + }; + struct ListUsrCods { long *Lst; // List of users' codes @@ -396,7 +404,8 @@ void Usr_UpdateMyLastData (void); void Usr_InsertMyLastCrsTabAndTime (void); void Usr_WriteRowUsrMainData (unsigned NumUsr,struct UsrData *UsrDat, - bool PutCheckBoxToSelectUsr,Rol_Role_t Role); + bool PutCheckBoxToSelectUsr,Rol_Role_t Role, + struct SelectedUsrs *SelectedUsrs); unsigned Usr_GetNumUsrsInCrs (Rol_Role_t Role,long CrsCod); unsigned Usr_GetNumUsrsInCrssOfDeg (Rol_Role_t Role,long DegCod); @@ -428,17 +437,20 @@ bool Usr_GetIfShowBigList (unsigned NumUsrs, void (*FuncParams) (void), const char *OnSubmit); -void Usr_PutHiddenParSelectedUsrsCods (void); -void Usr_CreateListSelectedUsrsCodsAndFillWithOtherUsr (void); -void Usr_GetListsSelectedUsrsCods (void); +void Usr_CreateListSelectedUsrsCodsAndFillWithOtherUsr (struct SelectedUsrs *SelectedUsrs); +void Usr_PutHiddenParSelectedUsrsCods (struct SelectedUsrs *SelectedUsrs); +void Usr_GetListsSelectedEncryptedUsrsCods (struct SelectedUsrs *SelectedUsrs); + bool Usr_GetListMsgRecipientsWrittenExplicitelyBySender (bool WriteErrorMsgs); bool Usr_FindEncryptedUsrCodsInListOfSelectedEncryptedUsrCods (const char *EncryptedUsrCodToFind); -bool Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods (void); -unsigned Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods (void); -void Usr_FreeListsSelectedEncryptedUsrsCods (void); +bool Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods (struct SelectedUsrs *SelectedUsrs); +unsigned Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods (struct SelectedUsrs *SelectedUsrs); +void Usr_FreeListsSelectedEncryptedUsrsCods (struct SelectedUsrs *SelectedUsrs); -void Usr_GetListSelectedUsrCods (unsigned NumUsrsInList,long **LstSelectedUsrCods); +void Usr_GetListSelectedUsrCods (struct SelectedUsrs *SelectedUsrs, + unsigned NumUsrsInList, + long **LstSelectedUsrCods); void Usr_FreeListSelectedUsrCods (long *LstSelectedUsrCods); void Usr_CreateSubqueryUsrCods (long LstSelectedUsrCods[], @@ -449,18 +461,19 @@ void Usr_FreeSubqueryUsrCods (char *SubQueryUsrs); void Usr_FreeListOtherRecipients (void); void Usr_ShowFormsToSelectUsrListType (void (*FuncParams) (void)); -void Usr_PutCheckboxToSelectAllUsers (Rol_Role_t Role); unsigned Usr_GetColumnsForSelectUsrs (void); void Usr_SetUsrDatMainFieldNames (void); void Usr_WriteHeaderFieldsUsrDat (bool PutCheckBoxToSelectUsr); -void Usr_PutFormToSelectUsrsToGoToAct (Act_Action_t NextAction,void (*FuncParams) (), +void Usr_PutFormToSelectUsrsToGoToAct (struct SelectedUsrs *SelectedUsrs, + Act_Action_t NextAction,void (*FuncParams) (), const char *Title, const char *HelpLink, const char *TxtButton); -void Usr_GetSelectedUsrsAndGoToAct (void (*FuncWhenUsrsSelected) (), +void Usr_GetSelectedUsrsAndGoToAct (struct SelectedUsrs *SelectedUsrs, + void (*FuncWhenUsrsSelected) (), void (*FuncWhenNoUsrsSelected) ()); -void Usr_ListUsersToSelect (Rol_Role_t Role); +void Usr_ListUsersToSelect (Rol_Role_t Role,struct SelectedUsrs *SelectedUsrs); void Usr_ListAllDataGsts (void); void Usr_ListAllDataStds (void); diff --git a/swad_zip.c b/swad_zip.c index d8920ddd..660bf017 100644 --- a/swad_zip.c +++ b/swad_zip.c @@ -100,7 +100,7 @@ void ZIP_PutLinkToCreateZIPAsgWrk (void) static void ZIP_PutLinkToCreateZIPAsgWrkParams (void) { - Usr_PutHiddenParSelectedUsrsCods (); + Usr_PutHiddenParSelectedUsrsCods (&Gbl.Usrs.Selected); Brw_PutHiddenParamFullTreeIfSelected (); Par_PutHiddenParamChar ("CreateZIP",'Y'); }