From 57edcf317bfa7691f11176be4bad7b3d7fa628a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Thu, 11 Apr 2019 09:55:35 +0200 Subject: [PATCH] Version18.110 --- swad_action.c | 32 ++++----- swad_action.h | 8 +-- swad_attendance.c | 15 +++-- swad_attendance.h | 1 + swad_changelog.h | 9 +-- swad_figure.c | 2 +- swad_file_browser.c | 47 +++++-------- swad_group.c | 7 +- swad_group.h | 4 +- swad_mail.c | 5 +- swad_message.c | 30 ++++++++- swad_message.h | 1 + swad_photo.c | 15 ++++- swad_photo.h | 2 + swad_project.c | 156 ++++++++++++++++++++++++++------------------ swad_project.h | 18 ++--- swad_scope.c | 5 ++ swad_scope.h | 1 + swad_statistic.c | 7 +- swad_test.c | 7 +- swad_text.c | 90 ++++++++++++++++++++++++- swad_user.c | 156 +++++++++++++++++++++----------------------- swad_user.h | 12 ++-- 23 files changed, 392 insertions(+), 238 deletions(-) diff --git a/swad_action.c b/swad_action.c index 98a3c19d..0f50a4dd 100644 --- a/swad_action.c +++ b/swad_action.c @@ -508,16 +508,16 @@ Assessment: 365. ActShoPrj Show project 366. ActReqAddStdPrj Request adding a student to a project 367. ActReqAddTutPrj Request adding a tutor to a project - 368. ActReqAddEvaPrj Request adding an evaluator to a project + 368. ActReqAddEvlPrj Request adding an evaluator to a project 369. ActAddStdPrj Add a student to a project 370. ActAddTutPrj Add a tutor to a project - 371. ActAddEvaPrj Add an evaluator to a project + 371. ActAddEvlPrj Add an evaluator to a project 372. ActReqRemStdPrj Request removing a student from a project 373. ActReqRemTutPrj Request removing a tutor from a project - 374. ActReqRemEvaPrj Request removing an evaluator from a project + 374. ActReqRemEvlPrj Request removing an evaluator from a project 375. ActRemStdPrj Remove a student from a project 376. ActRemTutPrj Remove a tutor from a project - 377. ActRemEvaPrj Remove an emulator from a project + 377. ActRemEvlPrj Remove an emulator from a project 378. ActAdmDocPrj Admin. project documents 379. ActReqRemFilDocPrj Request removal of a file from project documents @@ -2042,18 +2042,18 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* 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}, - /* ActReqAddStdPrj */{1684,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_ReqAddStd ,NULL}, - /* ActReqAddTutPrj */{1685,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_ReqAddTut ,NULL}, - /* ActReqAddEvaPrj */{1686,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_ReqAddEva ,NULL}, - /* ActAddStdPrj */{1687,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_AddStd ,NULL}, - /* ActAddTutPrj */{1688,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_AddTut ,NULL}, - /* ActAddEvaPrj */{1689,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_AddEva ,NULL}, + /* ActReqAddStdPrj */{1684,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_ReqAddStds ,NULL}, + /* ActReqAddTutPrj */{1685,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_ReqAddTuts ,NULL}, + /* ActReqAddEvlPrj */{1686,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_ReqAddEvls ,NULL}, + /* ActAddStdPrj */{1687,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_GetSelectedUsrsAndAddStds ,NULL}, + /* ActAddTutPrj */{1688,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_GetSelectedUsrsAndAddTuts ,NULL}, + /* ActAddEvlPrj */{1689,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_GetSelectedUsrsAndAddEvls ,NULL}, /* ActReqRemStdPrj */{1690,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_ReqRemStd ,NULL}, /* ActReqRemTutPrj */{1691,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_ReqRemTut ,NULL}, - /* ActReqRemEvaPrj */{1692,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_ReqRemEva ,NULL}, + /* ActReqRemEvlPrj */{1692,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_ReqRemEvl ,NULL}, /* ActRemStdPrj */{1693,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_RemStd ,NULL}, /* ActRemTutPrj */{1694,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_RemTut ,NULL}, - /* ActRemEvaPrj */{1695,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_RemEva ,NULL}, + /* ActRemEvlPrj */{1695,-1,TabUnk,ActSeePrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_RemEvl ,NULL}, /* ActAdmDocPrj */{1697,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_ShowFileBrowserOrWorks ,NULL}, /* ActReqRemFilDocPrj*/{1698,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_AskRemFileFromTree ,NULL}, @@ -4859,16 +4859,16 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un ActShoPrj, // #1683 ActReqAddStdPrj, // #1684 ActReqAddTutPrj, // #1685 - ActReqAddEvaPrj, // #1686 + ActReqAddEvlPrj, // #1686 ActAddStdPrj, // #1687 ActAddTutPrj, // #1688 - ActAddEvaPrj, // #1689 + ActAddEvlPrj, // #1689 ActReqRemStdPrj, // #1690 ActReqRemTutPrj, // #1691 - ActReqRemEvaPrj, // #1692 + ActReqRemEvlPrj, // #1692 ActRemStdPrj, // #1693 ActRemTutPrj, // #1694 - ActRemEvaPrj, // #1695 + ActRemEvlPrj, // #1695 ActSeeTblAllPrj, // #1696 ActAdmDocPrj, // #1697 ActReqRemFilDocPrj, // #1698 diff --git a/swad_action.h b/swad_action.h index 152a39ec..44ee7c6a 100644 --- a/swad_action.h +++ b/swad_action.h @@ -524,16 +524,16 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to #define ActShoPrj (ActChgCrsTT1stDay + 37) #define ActReqAddStdPrj (ActChgCrsTT1stDay + 38) #define ActReqAddTutPrj (ActChgCrsTT1stDay + 39) -#define ActReqAddEvaPrj (ActChgCrsTT1stDay + 40) +#define ActReqAddEvlPrj (ActChgCrsTT1stDay + 40) #define ActAddStdPrj (ActChgCrsTT1stDay + 41) #define ActAddTutPrj (ActChgCrsTT1stDay + 42) -#define ActAddEvaPrj (ActChgCrsTT1stDay + 43) +#define ActAddEvlPrj (ActChgCrsTT1stDay + 43) #define ActReqRemStdPrj (ActChgCrsTT1stDay + 44) #define ActReqRemTutPrj (ActChgCrsTT1stDay + 45) -#define ActReqRemEvaPrj (ActChgCrsTT1stDay + 46) +#define ActReqRemEvlPrj (ActChgCrsTT1stDay + 46) #define ActRemStdPrj (ActChgCrsTT1stDay + 47) #define ActRemTutPrj (ActChgCrsTT1stDay + 48) -#define ActRemEvaPrj (ActChgCrsTT1stDay + 49) +#define ActRemEvlPrj (ActChgCrsTT1stDay + 49) #define ActAdmDocPrj (ActChgCrsTT1stDay + 50) #define ActReqRemFilDocPrj (ActChgCrsTT1stDay + 51) diff --git a/swad_attendance.c b/swad_attendance.c index cf5654e6..bbf1146d 100644 --- a/swad_attendance.c +++ b/swad_attendance.c @@ -847,6 +847,11 @@ static void Att_GetAttEventDescriptionFromDB (long AttCod,char Description[Cns_M /************** Write parameter with code of attendance event ****************/ /*****************************************************************************/ +void Att_PutParamSelectedAttCod (void) + { + Att_PutParamAttCod (Gbl.AttEvents.AttCod); + } + void Att_PutParamAttCod (long AttCod) { Par_PutHiddenParamLong ("AttCod",AttCod); @@ -1948,7 +1953,8 @@ static void Att_ListAttStudents (struct AttendanceEvent *Att) Hlp_USERS_Attendance,Box_NOT_CLOSABLE); /***** Form to select groups *****/ - Grp_ShowFormToSelectSeveralGroups (ActSeeOneAtt,Grp_ONLY_MY_GROUPS); + Grp_ShowFormToSelectSeveralGroups (ActSeeOneAtt,Att_PutParamSelectedAttCod, + Grp_ONLY_MY_GROUPS); /***** Start section with user list *****/ Lay_StartSection (Usr_USER_LIST_SECTION_ID); @@ -2703,21 +2709,22 @@ void Usr_ReqListStdsAttendanceCrs (void) NULL,Box_NOT_CLOSABLE); /***** Form to select groups *****/ - Grp_ShowFormToSelectSeveralGroups (ActReqLstStdAtt,Grp_ONLY_MY_GROUPS); + Grp_ShowFormToSelectSeveralGroups (ActReqLstStdAtt,Att_PutParamSelectedAttCod, + Grp_ONLY_MY_GROUPS); /***** Start section with user list *****/ Lay_StartSection (Usr_USER_LIST_SECTION_ID); if (Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs) { - if (Usr_GetIfShowBigList (Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs,NULL)) + if (Usr_GetIfShowBigList (Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs,NULL,NULL)) { /***** Get list of selected users *****/ Usr_GetListsSelectedUsrsCods (); /***** Draw a class photo with students of the course *****/ /* Form to select type of list used for select several users */ - Usr_ShowFormsToSelectUsrListType (ActReqLstStdAtt); + Usr_ShowFormsToSelectUsrListType (ActReqLstStdAtt,NULL); /* Start form */ Frm_StartForm (ActSeeLstStdAtt); diff --git a/swad_attendance.h b/swad_attendance.h index 6829c668..a57cf634 100644 --- a/swad_attendance.h +++ b/swad_attendance.h @@ -81,6 +81,7 @@ void Att_RequestCreatOrEditAttEvent (void); bool Att_GetDataOfAttEventByCod (struct AttendanceEvent *Att); void Att_FreeListAttEvents (void); +void Att_PutParamSelectedAttCod (void); void Att_PutParamAttCod (long AttCod); long Att_GetParamAttCod (void); diff --git a/swad_changelog.h b/swad_changelog.h index 3a634ba1..a5f5dc8b 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -431,9 +431,6 @@ Lo de mutear anuncios, en principio prefiero hacer una opci // TODO: Ver cómo recibir un fichero desde el cliente (SWADroid) en gsoap -// TODO: Pedro Villar Castro: -// Al asignar un TFG a alumnos, no escribir el DNI del alumno, sino escogerlo de una lista de entre los alumnos inscritos en la asignatura. - // TODO: Pedro Villar Castro: // Bloquear individualmente la edición con una casilla de configuración para cada TFG, sólo el profesor de la asignatura (Perico) podría bloquear/desbloquear // Que haya una opción general que los bloquee todos y que los desbloquee todos @@ -459,10 +456,14 @@ En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 18.109.2 (2019-04-10)" +#define Log_PLATFORM_VERSION "SWAD 18.110 (2019-04-10)" #define CSS_FILE "swad18.92.css" #define JS_FILE "swad18.92.js" /* +Comprobar si Gbl.AttEvents.AttCodToEdit puede ser sustituido por Gbl.AttEvents.AttCod + + Version 18.110: Apr 10, 2019 Code refactoring in selection of groups and users. + Adding multiple users ad once to a project, suggested by Pedro Villar Castro. (242563 lines) Version 18.109.2: Apr 10, 2019 Code refactoring in selection of users to view homework. (242421 lines) Version 18.109.1: Apr 10, 2019 A non-editing teacher can choose students with no groups of a type. (242406 lines) Version 18.109: Apr 09, 2019 Code refactoring in edition of plugins. (242421 lines) diff --git a/swad_figure.c b/swad_figure.c index 0ba766c0..468cbbcf 100644 --- a/swad_figure.c +++ b/swad_figure.c @@ -1042,7 +1042,7 @@ static void Fig_GetAndShowInstitutionsStats (void) /***** Form to select type of list used to display degree photos *****/ Usr_GetAndUpdatePrefsAboutUsrList (); - Usr_ShowFormsToSelectUsrListType (ActSeeUseGbl); + Usr_ShowFormsToSelectUsrListType (ActSeeUseGbl,Fig_PutHiddenParamFigures); /***** Institutions ordered by number of centres *****/ Fig_GetAndShowInssOrderedByNumCtrs (); diff --git a/swad_file_browser.c b/swad_file_browser.c index e4ec5fc1..5b730ecb 100644 --- a/swad_file_browser.c +++ b/swad_file_browser.c @@ -1602,7 +1602,7 @@ void Brw_GetParAndInitFileBrowser (void) case ActChgToSeeDocCrs: // Access to see a documents zone /* Set file browser type acording to last group accessed */ Gbl.FileBrowser.Type = (Gbl.Crs.Grps.GrpCod > 0) ? Brw_SHOW_DOC_GRP : - Brw_SHOW_DOC_CRS; + Brw_SHOW_DOC_CRS; break; case ActSeeDocCrs: case ActExpSeeDocCrs: @@ -1623,7 +1623,7 @@ void Brw_GetParAndInitFileBrowser (void) case ActChgToAdmDocCrs: // Access to admin a documents zone /* Set file browser type acording to last group accessed */ Gbl.FileBrowser.Type = (Gbl.Crs.Grps.GrpCod > 0) ? Brw_ADMI_DOC_GRP : - Brw_ADMI_DOC_CRS; + Brw_ADMI_DOC_CRS; break; case ActAdmDocCrs: case ActReqRemFilDocCrs: @@ -1677,7 +1677,7 @@ void Brw_GetParAndInitFileBrowser (void) case ActChgToAdmTch: // Access to a teachers zone from menu /* Set file browser type acording to last group accessed */ Gbl.FileBrowser.Type = (Gbl.Crs.Grps.GrpCod > 0) ? Brw_ADMI_TCH_GRP : - Brw_ADMI_TCH_CRS; + Brw_ADMI_TCH_CRS; break; case ActAdmTchCrs: case ActReqRemFilTchCrs: @@ -1727,7 +1727,7 @@ void Brw_GetParAndInitFileBrowser (void) case ActChgToAdmSha: // Access to a shared zone from menu /* Set file browser type acording to last group accessed */ Gbl.FileBrowser.Type = (Gbl.Crs.Grps.GrpCod > 0) ? Brw_ADMI_SHR_GRP : - Brw_ADMI_SHR_CRS; + Brw_ADMI_SHR_CRS; break; case ActAdmShaCrs: case ActReqRemFilShaCrs: @@ -1917,12 +1917,12 @@ void Brw_GetParAndInitFileBrowser (void) case Rol_STD: case Rol_NET: Gbl.FileBrowser.Type = (Gbl.Crs.Grps.GrpCod > 0) ? Brw_SHOW_MRK_GRP : - Brw_SHOW_MRK_CRS; + Brw_SHOW_MRK_CRS; break; case Rol_TCH: case Rol_SYS_ADM: Gbl.FileBrowser.Type = (Gbl.Crs.Grps.GrpCod > 0) ? Brw_ADMI_MRK_GRP : - Brw_ADMI_MRK_CRS; + Brw_ADMI_MRK_CRS; break; default: Lay_ShowErrorAndExit ("Wrong role."); @@ -1932,7 +1932,7 @@ void Brw_GetParAndInitFileBrowser (void) case ActChgToSeeMrk: // Access to see a marks zone /* Set file browser type acording to last group accessed */ Gbl.FileBrowser.Type = (Gbl.Crs.Grps.GrpCod > 0) ? Brw_SHOW_MRK_GRP : - Brw_SHOW_MRK_CRS; + Brw_SHOW_MRK_CRS; break; case ActSeeMrkCrs: case ActExpSeeMrkCrs: @@ -1951,7 +1951,7 @@ void Brw_GetParAndInitFileBrowser (void) case ActChgToAdmMrk: // Access to admin a marks zone /* Set file browser type acording to last group accessed */ Gbl.FileBrowser.Type = (Gbl.Crs.Grps.GrpCod > 0) ? Brw_ADMI_MRK_GRP : - Brw_ADMI_MRK_CRS; + Brw_ADMI_MRK_CRS; break; case ActAdmMrkCrs: case ActReqRemFilMrkCrs: @@ -3057,7 +3057,8 @@ void Brw_AskEditWorksCrs (void) Brw_GetParAndInitFileBrowser (); /***** List users to select some of them *****/ - Usr_PutFormToSelectUsrsToGoToAct (ActReqAsgWrkCrs, + Usr_PutFormToSelectUsrsToGoToAct (ActReqAsgWrkCrs,NULL, // Current action + ActAdmAsgWrkCrs,NULL, // Next action Hlp_FILES_Homework_for_teachers, Txt_View_homework); } @@ -3408,24 +3409,8 @@ static void Brw_ShowDataOwnerAsgWrk (struct UsrData *UsrDat) void Brw_GetSelectedUsrsAndShowWorks (void) { - extern const char *Txt_You_must_select_one_ore_more_users; - - /***** Get lists of the selected users if not already got *****/ - Usr_GetListsSelectedUsrsCods (); - - /***** Check the number of users whose works will be shown *****/ - if (Usr_CountNumUsrsInListOfSelectedUsrs ()) // If some users are selected... - Brw_ShowFileBrowserOrWorks (); - else // If no users are selected... - { - // ...write warning alert - Ale_ShowAlert (Ale_WARNING,Txt_You_must_select_one_ore_more_users); - // ...and show again the form - Brw_AskEditWorksCrs (); - } - - /***** Free memory used by list of selected users' codes *****/ - Usr_FreeListsSelectedUsrsCods (); + Usr_GetSelectedUsrsAndGoToAct (Brw_ShowFileBrowserOrWorks, // when user(s) selected + Brw_AskEditWorksCrs); // when no user selected } /*****************************************************************************/ @@ -11648,7 +11633,7 @@ static bool Brw_CheckIfICanViewProjectDocuments (Prj_RoleInProject_t MyRoleInPro return false; case Prj_ROLE_STD: case Prj_ROLE_TUT: - case Prj_ROLE_EVA: + case Prj_ROLE_EVL: return true; } break; @@ -11677,7 +11662,7 @@ static bool Brw_CheckIfICanViewProjectAssessment (Prj_RoleInProject_t MyRoleInPr case Prj_ROLE_STD: // Students can not view or edit project assessment return false; case Prj_ROLE_TUT: - case Prj_ROLE_EVA: + case Prj_ROLE_EVL: return true; } break; @@ -11710,7 +11695,7 @@ static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void) return false; case Prj_ROLE_STD: case Prj_ROLE_TUT: - case Prj_ROLE_EVA: + case Prj_ROLE_EVL: return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_GetPublisherOfSubtree ()); // Am I the publisher of subtree? } break; @@ -11743,7 +11728,7 @@ static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void) case Prj_ROLE_STD: // Students can not view or edit project assessment return false; case Prj_ROLE_TUT: - case Prj_ROLE_EVA: + case Prj_ROLE_EVL: return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_GetPublisherOfSubtree ()); // Am I the publisher of subtree? } break; diff --git a/swad_group.c b/swad_group.c index 2cf1bf20..84740327 100644 --- a/swad_group.c +++ b/swad_group.c @@ -359,7 +359,7 @@ static void Grp_PutIconToCreateNewGroup (void) /*************** Show form to select one or several groups *******************/ /*****************************************************************************/ -void Grp_ShowFormToSelectSeveralGroups (Act_Action_t NextAction, +void Grp_ShowFormToSelectSeveralGroups (Act_Action_t NextAction,void (*FuncParams) (), Grp_WhichGroups_t GroupsSelectableByStdsOrNETs) { extern const char *Hlp_USERS_Groups; @@ -385,9 +385,8 @@ void Grp_ShowFormToSelectSeveralGroups (Act_Action_t NextAction, depending on the groups selected *****/ Frm_StartFormAnchor (NextAction,Usr_USER_LIST_SECTION_ID); Usr_PutParamsPrefsAboutUsrList (); - - /***** Put parameters needed depending on the action *****/ - Usr_PutExtraParamsUsrList (NextAction); + if (FuncParams) + FuncParams (); /***** Select all groups *****/ Grp_PutCheckboxAllGrps (GroupsSelectableByStdsOrNETs); diff --git a/swad_group.h b/swad_group.h index b5e4adbd..cd9fec7d 100644 --- a/swad_group.h +++ b/swad_group.h @@ -147,8 +147,8 @@ typedef enum void Grp_WriteNamesOfSelectedGrps (void); void Grp_ReqEditGroups (void); -void Grp_ShowFormToSelectSeveralGroups (Act_Action_t NextAction, - Grp_WhichGroups_t GroupsSelectable); +void Grp_ShowFormToSelectSeveralGroups (Act_Action_t NextAction,void (*FuncParams) (), + Grp_WhichGroups_t GroupsSelectableByStdsOrNETs); void Grp_PutParamsCodGrps (void); void Grp_GetParCodsSeveralGrpsToShowUsrs (void); void Grp_GetParCodsSeveralGrps (void); diff --git a/swad_mail.c b/swad_mail.c index 608d0d63..24a6c9e4 100644 --- a/swad_mail.c +++ b/swad_mail.c @@ -906,14 +906,15 @@ void Mai_ListEmails (void) Hlp_MESSAGES_Email,Box_NOT_CLOSABLE); /***** Form to select groups *****/ - Grp_ShowFormToSelectSeveralGroups (ActMaiStd,Grp_ONLY_MY_GROUPS); + Grp_ShowFormToSelectSeveralGroups (ActMaiStd,NULL, + Grp_ONLY_MY_GROUPS); /***** Start section with user list *****/ Lay_StartSection (Usr_USER_LIST_SECTION_ID); if (Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs) { - if (Usr_GetIfShowBigList (Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs,NULL)) + if (Usr_GetIfShowBigList (Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs,NULL,NULL)) { /***** Initialize structure with user's data *****/ Usr_UsrDataConstructor (&UsrDat); diff --git a/swad_message.c b/swad_message.c index d27e5fb6..7ca93a0c 100644 --- a/swad_message.c +++ b/swad_message.c @@ -240,7 +240,7 @@ static void Msg_PutFormMsgUsrs (char Content[Cns_MAX_BYTES_LONG_TEXT + 1]) if (GetUsrsInCrs) { /***** Form to select groups *****/ - Grp_ShowFormToSelectSeveralGroups (ActReqMsgUsr, + Grp_ShowFormToSelectSeveralGroups (ActReqMsgUsr,Msg_PutParamsWriteMsg, Grp_ONLY_MY_GROUPS); /***** Start section with user list *****/ @@ -249,13 +249,15 @@ static void Msg_PutFormMsgUsrs (char Content[Cns_MAX_BYTES_LONG_TEXT + 1]) if (NumUsrsInCrs) { /***** Form to select type of list used for select several users *****/ - Usr_ShowFormsToSelectUsrListType (ActReqMsgUsr); + Usr_ShowFormsToSelectUsrListType (ActReqMsgUsr,Msg_PutParamsWriteMsg); /***** Put link to register students *****/ Enr_CheckStdsAndPutButtonToRegisterStdsInCurrentCrs (); /***** Check if it's a big list *****/ - ShowUsrsInCrs = Usr_GetIfShowBigList (NumUsrsInCrs,"CopyMessageToHiddenFields();"); + ShowUsrsInCrs = Usr_GetIfShowBigList (NumUsrsInCrs, + Msg_PutParamsWriteMsg, + "CopyMessageToHiddenFields();"); if (ShowUsrsInCrs) /***** Get lists of selected users *****/ @@ -388,6 +390,28 @@ static void Msg_PutParamsShowMorePotentialRecipients (void) Msg_PutHiddenParamsSubjectAndContent (); } +/*****************************************************************************/ +/***************** Put parameters when writing a message *********************/ +/*****************************************************************************/ + +void Msg_PutParamsWriteMsg (void) + { + Usr_PutHiddenParUsrCodAll (ActReqMsgUsr,Gbl.Usrs.Selected.List[Rol_UNK]); + Msg_PutHiddenParamOtherRecipients (); + Msg_PutHiddenParamsSubjectAndContent (); + if (Gbl.Msg.Reply.IsReply) + { + Par_PutHiddenParamChar ("IsReply",'Y'); + Msg_PutHiddenParamMsgCod (Gbl.Msg.Reply.OriginalMsgCod); + } + if (Gbl.Usrs.Other.UsrDat.UsrCod > 0) + { + Usr_PutParamOtherUsrCodEncrypted (); + if (Gbl.Msg.ShowOnlyOneRecipient) + Par_PutHiddenParamChar ("ShowOnlyOneRecipient",'Y'); + } + } + /*****************************************************************************/ /********** Put hidden parameters with message subject and content ***********/ /*****************************************************************************/ diff --git a/swad_message.h b/swad_message.h index 8e3bd95e..b1e90832 100644 --- a/swad_message.h +++ b/swad_message.h @@ -59,6 +59,7 @@ typedef enum /*****************************************************************************/ void Msg_FormMsgUsrs (void); +void Msg_PutParamsWriteMsg (void); void Msg_PutHiddenParamsSubjectAndContent (void); void Msg_PutHiddenParamAnotherRecipient (const struct UsrData *UsrDat); void Msg_PutHiddenParamOtherRecipients (void); diff --git a/swad_photo.c b/swad_photo.c index db1ef39e..ca9033a3 100644 --- a/swad_photo.c +++ b/swad_photo.c @@ -1761,6 +1761,17 @@ void Pho_ShowOrPrintPhotoDegree (Pho_AvgPhotoSeeOrPrint_t SeeOrPrint) Box_EndBox (); } +/*****************************************************************************/ +/**************** Put parameter for degree average photos ********************/ +/*****************************************************************************/ + +void Pho_PutParamsDegPhoto () + { + Pho_PutHiddenParamTypeOfAvg (); + Pho_PutHiddenParamPhotoSize (); + Pho_PutHiddenParamOrderDegrees (); + } + /*****************************************************************************/ /******************* Put a selector for the type of average ******************/ /*****************************************************************************/ @@ -2106,7 +2117,7 @@ static void Pho_ShowOrPrintClassPhotoDegrees (Pho_AvgPhotoSeeOrPrint_t SeeOrPrin { /***** Form to select type of list used to display degree photos *****/ if (SeeOrPrint == Pho_DEGREES_SEE) - Usr_ShowFormsToSelectUsrListType (ActSeePhoDeg); + Usr_ShowFormsToSelectUsrListType (ActSeePhoDeg,Pho_PutParamsDegPhoto); Tbl_StartTableCenter (0); /***** Get and print degrees *****/ @@ -2187,7 +2198,7 @@ static void Pho_ShowOrPrintListDegrees (Pho_AvgPhotoSeeOrPrint_t SeeOrPrint) /***** Class photo start *****/ if (SeeOrPrint == Pho_DEGREES_SEE) /***** Form to select type of list used to display degree photos *****/ - Usr_ShowFormsToSelectUsrListType (ActSeePhoDeg); + Usr_ShowFormsToSelectUsrListType (ActSeePhoDeg,Pho_PutParamsDegPhoto); /***** Write heading *****/ Tbl_StartTableCenter (2); diff --git a/swad_photo.h b/swad_photo.h index 4ee28d1f..e87c36a0 100644 --- a/swad_photo.h +++ b/swad_photo.h @@ -120,6 +120,8 @@ void Pho_RemoveObsoleteStatDegrees (void); void Pho_ShowPhotoDegree (void); void Pho_PrintPhotoDegree (void); void Pho_ShowOrPrintPhotoDegree (Pho_AvgPhotoSeeOrPrint_t SeeOrPrint); + +void Pho_PutParamsDegPhoto (); void Pho_PutHiddenParamTypeOfAvg (void); void Pho_PutHiddenParamPhotoSize (void); void Pho_PutHiddenParamOrderDegrees (void); diff --git a/swad_project.c b/swad_project.c index dda008ad..612a4c5a 100644 --- a/swad_project.c +++ b/swad_project.c @@ -75,7 +75,7 @@ static const Prj_RoleInProject_t Prj_RolesToShow[] = { Prj_ROLE_TUT, // Tutor Prj_ROLE_STD, // Student - Prj_ROLE_EVA, // Evaluator + Prj_ROLE_EVL, // Evaluator }; static const unsigned Brw_NUM_ROLES_TO_SHOW = sizeof (Prj_RolesToShow) / sizeof (Prj_RolesToShow[0]); @@ -159,8 +159,11 @@ static unsigned Prj_GetUsrsInPrj (long PrjCod,Prj_RoleInProject_t RoleInProject, static Prj_RoleInProject_t Prj_ConvertUnsignedStrToRoleInProject (const char *UnsignedStr); -static void Prj_ReqAnotherUsrID (Prj_RoleInProject_t RoleInProject); -static void Prj_AddUsrToProject (Prj_RoleInProject_t RoleInProject); +static void Prj_ReqAddUsrs (Prj_RoleInProject_t RoleInProject); +static void Prj_AddStds (void); +static void Prj_AddTuts (void); +static void Prj_AddEvls (void); +static void Prj_AddUsrsToProject (Prj_RoleInProject_t RoleInProject); static void Prj_ReqRemUsrFromPrj (Prj_RoleInProject_t RoleInProject); static void Prj_RemUsrFromPrj (Prj_RoleInProject_t RoleInProject); @@ -1553,7 +1556,7 @@ static void Prj_ShowOneProjectMembersWithARole (const struct Project *Prj, extern const char *Txt_PROJECT_ROLES_PLURAL_Abc[Prj_NUM_ROLES_IN_PROJECT]; extern const char *Txt_Remove; extern const char *Txt_Add_USER; - extern const char *Txt_PROJECT_ROLES_SINGUL_abc[Prj_NUM_ROLES_IN_PROJECT]; + extern const char *Txt_PROJECT_ROLES_PLURAL_abc[Prj_NUM_ROLES_IN_PROJECT]; MYSQL_RES *mysql_res; MYSQL_ROW row; bool WriteRow; @@ -1566,14 +1569,14 @@ static void Prj_ShowOneProjectMembersWithARole (const struct Project *Prj, ActUnk, // Prj_ROLE_UNK, Unknown ActReqRemStdPrj, // Prj_ROLE_STD, Student ActReqRemTutPrj, // Prj_ROLE_TUT, Tutor - ActReqRemEvaPrj, // Prj_ROLE_EVA, Evaluator + ActReqRemEvlPrj, // Prj_ROLE_EVL, Evaluator }; static const Act_Action_t ActionReqAddUsr[Prj_NUM_ROLES_IN_PROJECT] = { ActUnk, // Prj_ROLE_UNK, Unknown ActReqAddStdPrj, // Prj_ROLE_STD, Student ActReqAddTutPrj, // Prj_ROLE_TUT, Tutor - ActReqAddEvaPrj, // Prj_ROLE_EVA, Evaluator + ActReqAddEvlPrj, // Prj_ROLE_EVL, Evaluator }; /***** Get users in project from database *****/ @@ -1698,7 +1701,7 @@ static void Prj_ShowOneProjectMembersWithARole (const struct Project *Prj, Gbl.Prjs.PrjCod = Prj->PrjCod; // Used to pass project code as a parameter snprintf (Gbl.Title,sizeof (Gbl.Title), Txt_Add_USER, - Txt_PROJECT_ROLES_SINGUL_abc[RoleInProject]); + Txt_PROJECT_ROLES_PLURAL_abc[RoleInProject]); Ico_PutContextualIconToAdd (ActionReqAddUsr[RoleInProject],NULL, Prj_PutCurrentParams, Gbl.Title); @@ -1854,129 +1857,156 @@ static Prj_RoleInProject_t Prj_ConvertUnsignedStrToRoleInProject (const char *Un } /*****************************************************************************/ -/*** Request another user's ID, @nickname or email to add user to project ****/ +/******************* Request users to be added to project ********************/ /*****************************************************************************/ -void Prj_ReqAddStd (void) +void Prj_ReqAddStds (void) { - Prj_ReqAnotherUsrID (Prj_ROLE_STD); + Prj_ReqAddUsrs (Prj_ROLE_STD); } -void Prj_ReqAddTut (void) +void Prj_ReqAddTuts (void) { - Prj_ReqAnotherUsrID (Prj_ROLE_TUT); + Prj_ReqAddUsrs (Prj_ROLE_TUT); } -void Prj_ReqAddEva (void) +void Prj_ReqAddEvls (void) { - Prj_ReqAnotherUsrID (Prj_ROLE_EVA); + Prj_ReqAddUsrs (Prj_ROLE_EVL); } -static void Prj_ReqAnotherUsrID (Prj_RoleInProject_t RoleInProject) +static void Prj_ReqAddUsrs (Prj_RoleInProject_t RoleInProject) { extern const char *Hlp_ASSESSMENT_Projects_add_user; extern const char *Txt_Add_USER; - extern const char *Txt_PROJECT_ROLES_SINGUL_abc[Prj_NUM_ROLES_IN_PROJECT]; + extern const char *Txt_PROJECT_ROLES_PLURAL_abc[Prj_NUM_ROLES_IN_PROJECT]; static Act_Action_t ActionAddUsr[Prj_NUM_ROLES_IN_PROJECT] = { ActUnk, // Prj_ROLE_UNK, Unknown ActAddStdPrj, // Prj_ROLE_STD, Student ActAddTutPrj, // Prj_ROLE_TUT, Tutor - ActAddEvaPrj, // Prj_ROLE_EVA, Evaluator + ActAddEvlPrj, // Prj_ROLE_EVL, Evaluator }; + char TxtButton[Lay_MAX_BYTES_TITLE + 1]; /***** Get project code *****/ if ((Gbl.Prjs.PrjCod = Prj_GetParamPrjCod ()) == -1L) Lay_ShowErrorAndExit ("Code of project is missing."); - /***** Start box *****/ - snprintf (Gbl.Title,sizeof (Gbl.Title), + /***** Put form to select users *****/ + snprintf (TxtButton,sizeof (TxtButton), Txt_Add_USER, - Txt_PROJECT_ROLES_SINGUL_abc[RoleInProject]); - Box_StartBox (NULL,Gbl.Title,NULL, - Hlp_ASSESSMENT_Projects_add_user,Box_NOT_CLOSABLE); + Txt_PROJECT_ROLES_PLURAL_abc[RoleInProject]); + Usr_PutFormToSelectUsrsToGoToAct (Gbl.Action.Act,Prj_PutCurrentParams, // Current action + ActionAddUsr[RoleInProject],Prj_PutCurrentParams, // Next action + Hlp_ASSESSMENT_Projects_add_user, + TxtButton); + + /***** Start box *****/ + // snprintf (Gbl.Title,sizeof (Gbl.Title), + // Txt_Add_USER, + // Txt_PROJECT_ROLES_SINGUL_abc[RoleInProject]); + // Box_StartBox (NULL,Gbl.Title,NULL, + // Hlp_ASSESSMENT_Projects_add_user,Box_NOT_CLOSABLE); /***** Write form to request another user's ID *****/ - Enr_WriteFormToReqAnotherUsrID (ActionAddUsr[RoleInProject],Prj_PutCurrentParams); + // Enr_WriteFormToReqAnotherUsrID (ActionAddUsr[RoleInProject],Prj_PutCurrentParams); /***** End box *****/ - Box_EndBox (); + // Box_EndBox (); /***** Put a form to create/edit project *****/ Prj_RequestCreatOrEditPrj (Gbl.Prjs.PrjCod); } /*****************************************************************************/ -/**************************** Add user to project ****************************/ +/******* Get and check list of selected users, and show users' works ********/ /*****************************************************************************/ -void Prj_AddStd (void) +void Prj_GetSelectedUsrsAndAddStds (void) { - Prj_AddUsrToProject (Prj_ROLE_STD); + Usr_GetSelectedUsrsAndGoToAct (Prj_AddStds, // when user(s) selected + Prj_ReqAddStds); // when no user selected } -void Prj_AddTut (void) +void Prj_GetSelectedUsrsAndAddTuts (void) { - Prj_AddUsrToProject (Prj_ROLE_TUT); + Usr_GetSelectedUsrsAndGoToAct (Prj_AddTuts, // when user(s) selected + Prj_ReqAddTuts); // when no user selected } -void Prj_AddEva (void) +void Prj_GetSelectedUsrsAndAddEvls (void) { - Prj_AddUsrToProject (Prj_ROLE_EVA); + Usr_GetSelectedUsrsAndGoToAct (Prj_AddEvls, // when user(s) selected + Prj_ReqAddEvls); // when no user selected } -static void Prj_AddUsrToProject (Prj_RoleInProject_t RoleInProject) +/*****************************************************************************/ +/**************************** Add users to project ***************************/ +/*****************************************************************************/ + +static void Prj_AddStds (void) + { + Prj_AddUsrsToProject (Prj_ROLE_STD); + } + +static void Prj_AddTuts (void) + { + Prj_AddUsrsToProject (Prj_ROLE_TUT); + } + +static void Prj_AddEvls (void) + { + Prj_AddUsrsToProject (Prj_ROLE_EVL); + } + +static void Prj_AddUsrsToProject (Prj_RoleInProject_t RoleInProject) { extern const char *Txt_THE_USER_X_has_been_enroled_as_a_Y_in_the_project; extern const char *Txt_PROJECT_ROLES_SINGUL_abc[Prj_NUM_ROLES_IN_PROJECT]; long PrjCod; - struct ListUsrCods ListUsrCods; - unsigned NumUsr; + const char *Ptr; bool ItsMe; /***** Get project code *****/ if ((PrjCod = Prj_GetParamPrjCod ()) == -1L) Lay_ShowErrorAndExit ("Code of project is missing."); - /***** Use user's ID to identify the user(s) to be enroled /removed *****/ - Usr_GetParamOtherUsrIDNickOrEMailAndGetUsrCods (&ListUsrCods); - - if (ListUsrCods.NumUsrs) // User(s) found with the ID + /***** Add the selected users to project *****/ + Ptr = Gbl.Usrs.Selected.List[Rol_UNK]; + while (*Ptr) { - /***** For each user found... *****/ - for (NumUsr = 0; - NumUsr < ListUsrCods.NumUsrs; - NumUsr++) - { - /* Get user's data */ - Gbl.Usrs.Other.UsrDat.UsrCod = ListUsrCods.Lst[NumUsr]; - Usr_GetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,Usr_DONT_GET_PREFS); + /* Get next user */ + Par_GetNextStrUntilSeparParamMult (&Ptr,Gbl.Usrs.Other.UsrDat.EncryptedUsrCod, + Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64); + Usr_GetUsrCodFromEncryptedUsrCod (&Gbl.Usrs.Other.UsrDat); + /* Get user's data */ + if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,Usr_DONT_GET_PREFS)) // Get of the database the data of the user + { /* Add user to project */ DB_QueryREPLACE ("can not add user to project", "REPLACE INTO prj_usr" " (PrjCod,RoleInProject,UsrCod)" " VALUES" " (%ld,%u,%ld)", - PrjCod,(unsigned) RoleInProject, - Gbl.Usrs.Other.UsrDat.UsrCod); + PrjCod,(unsigned) RoleInProject, + Gbl.Usrs.Other.UsrDat.UsrCod); - /***** Flush cache *****/ + /* Flush cache */ ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod); if (ItsMe) Prj_FlushCacheMyRoleInProject (); /* Show success alert */ Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_has_been_enroled_as_a_Y_in_the_project, - Gbl.Usrs.Other.UsrDat.FullName, - Txt_PROJECT_ROLES_SINGUL_abc[RoleInProject]); - } - - /***** Free list of users' codes *****/ - Usr_FreeListUsrCods (&ListUsrCods); + Gbl.Usrs.Other.UsrDat.FullName, + Txt_PROJECT_ROLES_SINGUL_abc[RoleInProject]); + } } - else // No users found - Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); + + /***** Free memory used by list of selected users' codes *****/ + Usr_FreeListsSelectedUsrsCods (); /***** Put form to edit project again *****/ Prj_RequestCreatOrEditPrj (PrjCod); @@ -1996,9 +2026,9 @@ void Prj_ReqRemTut (void) Prj_ReqRemUsrFromPrj (Prj_ROLE_TUT); } -void Prj_ReqRemEva (void) +void Prj_ReqRemEvl (void) { - Prj_ReqRemUsrFromPrj (Prj_ROLE_EVA); + Prj_ReqRemUsrFromPrj (Prj_ROLE_EVL); } static void Prj_ReqRemUsrFromPrj (Prj_RoleInProject_t RoleInProject) @@ -2013,7 +2043,7 @@ static void Prj_ReqRemUsrFromPrj (Prj_RoleInProject_t RoleInProject) ActUnk, // Prj_ROLE_UNK, Unknown ActRemStdPrj, // Prj_ROLE_STD, Student ActRemTutPrj, // Prj_ROLE_TUT, Tutor - ActRemEvaPrj, // Prj_ROLE_EVA, Evaluator + ActRemEvlPrj, // Prj_ROLE_EVL, Evaluator }; struct Project Prj; bool ItsMe; @@ -2084,9 +2114,9 @@ void Prj_RemTut (void) Prj_RemUsrFromPrj (Prj_ROLE_TUT); } -void Prj_RemEva (void) +void Prj_RemEvl (void) { - Prj_RemUsrFromPrj (Prj_ROLE_EVA); + Prj_RemUsrFromPrj (Prj_ROLE_EVL); } static void Prj_RemUsrFromPrj (Prj_RoleInProject_t RoleInProject) @@ -2221,7 +2251,7 @@ bool Prj_CheckIfICanViewProjectFiles (Prj_RoleInProject_t MyRoleInProject) return false; case Prj_ROLE_STD: case Prj_ROLE_TUT: - case Prj_ROLE_EVA: + case Prj_ROLE_EVL: return true; } return false; diff --git a/swad_project.h b/swad_project.h index 7edd8b70..dcbc9ab3 100644 --- a/swad_project.h +++ b/swad_project.h @@ -113,7 +113,7 @@ typedef enum Prj_ROLE_UNK = 0, // Unknown Prj_ROLE_STD = 1, // Student Prj_ROLE_TUT = 2, // Tutor - Prj_ROLE_EVA = 3, // Evaluator + Prj_ROLE_EVL = 3, // Evaluator } Prj_RoleInProject_t; /***** Struct to store a project *****/ @@ -154,21 +154,21 @@ void Prj_PrintOneProject (void); void Prj_FlushCacheMyRoleInProject (void); Prj_RoleInProject_t Prj_GetMyRoleInProject (long PrjCod); -void Prj_ReqAddStd (void); -void Prj_ReqAddTut (void); -void Prj_ReqAddEva (void); +void Prj_ReqAddStds (void); +void Prj_ReqAddTuts (void); +void Prj_ReqAddEvls (void); -void Prj_AddStd (void); -void Prj_AddTut (void); -void Prj_AddEva (void); +void Prj_GetSelectedUsrsAndAddStds (void); +void Prj_GetSelectedUsrsAndAddTuts (void); +void Prj_GetSelectedUsrsAndAddEvls (void); void Prj_ReqRemStd (void); void Prj_ReqRemTut (void); -void Prj_ReqRemEva (void); +void Prj_ReqRemEvl (void); void Prj_RemStd (void); void Prj_RemTut (void); -void Prj_RemEva (void); +void Prj_RemEvl (void); void Prj_PutHiddenParamPrjOrder (void); diff --git a/swad_scope.c b/swad_scope.c index ab472aee..4622c8d3 100644 --- a/swad_scope.c +++ b/swad_scope.c @@ -169,6 +169,11 @@ void Sco_PutSelectorScope (const char *ParamName,bool SendOnChange) /********************** Put hidden parameter scope ***************************/ /*****************************************************************************/ +void Sco_PutParamCurrentScope (void) + { + Sco_PutParamScope ("ScopeUsr",Gbl.Scope.Current); + } + void Sco_PutParamScope (const char *ParamName,Hie_Level_t Scope) { Par_PutHiddenParamUnsigned (ParamName,(unsigned) Scope); diff --git a/swad_scope.h b/swad_scope.h index aab2eefd..a089c110 100644 --- a/swad_scope.h +++ b/swad_scope.h @@ -44,6 +44,7 @@ /*****************************************************************************/ void Sco_PutSelectorScope (const char *ParamName,bool SendOnChange); +void Sco_PutParamCurrentScope (void); void Sco_PutParamScope (const char *ParamName,Hie_Level_t Scope); void Sco_GetScope (const char *ParamName); void Sco_AdjustScope (void); diff --git a/swad_statistic.c b/swad_statistic.c index 3e1d42b8..3cb65e6c 100644 --- a/swad_statistic.c +++ b/swad_statistic.c @@ -350,17 +350,18 @@ void Sta_AskShowCrsHits (void) Hlp_ANALYTICS_Visits_visits_to_course,Box_NOT_CLOSABLE); /***** Show form to select the groups *****/ - Grp_ShowFormToSelectSeveralGroups (ActReqAccCrs,Grp_ONLY_MY_GROUPS); + Grp_ShowFormToSelectSeveralGroups (ActReqAccCrs,NULL, + Grp_ONLY_MY_GROUPS); /***** Start section with user list *****/ Lay_StartSection (Usr_USER_LIST_SECTION_ID); if (NumTotalUsrs) { - if (Usr_GetIfShowBigList (NumTotalUsrs,NULL)) + if (Usr_GetIfShowBigList (NumTotalUsrs,NULL,NULL)) { /***** Form to select type of list used for select several users *****/ - Usr_ShowFormsToSelectUsrListType (ActReqAccCrs); + Usr_ShowFormsToSelectUsrListType (ActReqAccCrs,NULL); /***** Put link to register students *****/ Enr_CheckStdsAndPutButtonToRegisterStdsInCurrentCrs (); diff --git a/swad_test.c b/swad_test.c index 66b13e42..60af1ef5 100644 --- a/swad_test.c +++ b/swad_test.c @@ -7329,17 +7329,18 @@ void Tst_SelUsrsToSeeUsrsTestResults (void) Hlp_ASSESSMENT_Tests_test_results,Box_NOT_CLOSABLE); /***** Show form to select the groups *****/ - Grp_ShowFormToSelectSeveralGroups (ActReqSeeUsrTstRes,Grp_ONLY_MY_GROUPS); + Grp_ShowFormToSelectSeveralGroups (ActReqSeeUsrTstRes,NULL, + Grp_ONLY_MY_GROUPS); /***** Start section with user list *****/ Lay_StartSection (Usr_USER_LIST_SECTION_ID); if (NumTotalUsrs) { - if (Usr_GetIfShowBigList (NumTotalUsrs,NULL)) + if (Usr_GetIfShowBigList (NumTotalUsrs,NULL,NULL)) { /***** Form to select type of list used for select several users *****/ - Usr_ShowFormsToSelectUsrListType (ActReqSeeUsrTstRes); + Usr_ShowFormsToSelectUsrListType (ActReqSeeUsrTstRes,NULL); /***** Start form *****/ Frm_StartForm (ActSeeUsrTstRes); diff --git a/swad_text.c b/swad_text.c index 3030d824..1e2f2ff8 100644 --- a/swad_text.c +++ b/swad_text.c @@ -30098,7 +30098,7 @@ const char *Txt_PROJECT_ROLES_SINGUL_Abc[Prj_NUM_ROLES_IN_PROJECT] = "Tutor/a" #endif , -#if L==1 // ca // Prj_ROLE_EVA +#if L==1 // ca // Prj_ROLE_EVL "Avaluador/a" #elif L==2 // de "Auswerter" @@ -30181,7 +30181,7 @@ const char *Txt_PROJECT_ROLES_SINGUL_abc[Prj_NUM_ROLES_IN_PROJECT] = "tutor/a" #endif , -#if L==1 // ca // Prj_ROLE_EVA +#if L==1 // ca // Prj_ROLE_EVL "avaluador/a" #elif L==2 // de "Auswerter" @@ -30264,7 +30264,7 @@ const char *Txt_PROJECT_ROLES_PLURAL_Abc[Prj_NUM_ROLES_IN_PROJECT] = "Tutores" #endif , -#if L==1 // ca // Prj_ROLE_EVA +#if L==1 // ca // Prj_ROLE_EVL "Avaluadors" #elif L==2 // de "Auswerter" @@ -30285,6 +30285,90 @@ const char *Txt_PROJECT_ROLES_PLURAL_Abc[Prj_NUM_ROLES_IN_PROJECT] = #endif }; +const char *Txt_PROJECT_ROLES_PLURAL_abc[Prj_NUM_ROLES_IN_PROJECT] = + { +#if L==1 // ca // Prj_ROLE_UNK + "desconeguts" +#elif L==2 // de + "Unbekannte" +#elif L==3 // en + "unknown" +#elif L==4 // es + "desconocidos" +#elif L==5 // fr + "inconnus" +#elif L==6 // gn + "desconocidos" // Okoteve traducción +#elif L==7 // it + "sconosciuti" +#elif L==8 // pl + "nieznany" +#elif L==9 // pt + "desconhecidos" +#endif + , +#if L==1 // ca // Prj_ROLE_STD + "estudiants" +#elif L==2 // de + "Studenten" +#elif L==3 // en + "students" +#elif L==4 // es + "estudiantes" +#elif L==5 // fr + "étudiants" +#elif L==6 // gn + "temimbo'e" +#elif L==7 // it + "studenti" +#elif L==8 // pl + "studenci" +#elif L==9 // pt + "estudantes" +#endif + , +#if L==1 // ca // Prj_ROLE_TUT + "tutors" +#elif L==2 // de + "Tutoren" +#elif L==3 // en + "tutors" +#elif L==4 // es + "tutores" +#elif L==5 // fr + "tuteurs" +#elif L==6 // gn + "tutores" // Okoteve traducción +#elif L==7 // it + "precettori" +#elif L==8 // pl + "nauczyciele" +#elif L==9 // pt + "tutores" +#endif + , +#if L==1 // ca // Prj_ROLE_EVL + "avaluadors" +#elif L==2 // de + "Auswerter" +#elif L==3 // en + "evaluators" +#elif L==4 // es + "evaluadores" +#elif L==5 // fr + "évaluateurs" +#elif L==6 // gn + "evaluadores" // Okoteve traducción +#elif L==7 // it + "valutatori" +#elif L==8 // pl + "ewaluatorów" +#elif L==9 // pt + "avaliadores" +#endif + }; + + const char *Txt_PROJECT_STATUS[Prj_NUM_PROPOSAL_TYPES] = { #if L==1 // ca // Prj_PROPOSAL_NEW diff --git a/swad_user.c b/swad_user.c index 4f91b942..2d2f1193 100644 --- a/swad_user.c +++ b/swad_user.c @@ -151,9 +151,11 @@ const char *Usr_UsrDatMainFieldNames[Usr_NUM_MAIN_FIELDS_DATA_USR]; extern struct Globals Gbl; /*****************************************************************************/ -/************************* Internal global variables *************************/ +/****************************** Private variables ****************************/ /*****************************************************************************/ +static void (*Usr_FuncParamsBigList) (); // Used to pass pointer to function + /*****************************************************************************/ /***************************** Private prototypes ****************************/ /*****************************************************************************/ @@ -198,13 +200,16 @@ static void Usr_GetGstsLst (Hie_Level_t Scope); static void Usr_GetListUsrsFromQuery (char *Query,Rol_Role_t Role,Hie_Level_t Scope); static void Usr_AllocateUsrsList (Rol_Role_t Role); -static void Usr_PutButtonToConfirmIWantToSeeBigList (unsigned NumUsrs,const char *OnSubmit); +static void Usr_PutButtonToConfirmIWantToSeeBigList (unsigned NumUsrs, + void (*FuncParams) (), + const char *OnSubmit); static void Usr_PutParamsConfirmIWantToSeeBigList (void); static void Usr_AllocateListSelectedUsrCod (Rol_Role_t Role); static void Usr_AllocateListOtherRecipients (void); -static void Usr_FormToSelectUsrListType (Act_Action_t NextAction,Usr_ShowUsrsType_t ListType); +static void Usr_FormToSelectUsrListType (Act_Action_t NextAction,void (*FuncParams) (), + Usr_ShowUsrsType_t ListType); static Usr_Sex_t Usr_GetSexOfUsrsLst (Rol_Role_t Role); @@ -5589,7 +5594,9 @@ void Usr_FreeUsrsList (Rol_Role_t Role) /******** Show form to confirm that I want to see a big list of users ********/ /*****************************************************************************/ -bool Usr_GetIfShowBigList (unsigned NumUsrs,const char *OnSubmit) +bool Usr_GetIfShowBigList (unsigned NumUsrs, + void (*FuncParams) (), + const char *OnSubmit) { bool ShowBigList; @@ -5599,7 +5606,7 @@ bool Usr_GetIfShowBigList (unsigned NumUsrs,const char *OnSubmit) /***** Get parameter with user's confirmation to see a big list of users *****/ if (!(ShowBigList = Par_GetParToBool ("ShowBigList"))) - Usr_PutButtonToConfirmIWantToSeeBigList (NumUsrs,OnSubmit); + Usr_PutButtonToConfirmIWantToSeeBigList (NumUsrs,FuncParams,OnSubmit); return ShowBigList; } @@ -5611,12 +5618,15 @@ bool Usr_GetIfShowBigList (unsigned NumUsrs,const char *OnSubmit) /******** Show form to confirm that I want to see a big list of users ********/ /*****************************************************************************/ -static void Usr_PutButtonToConfirmIWantToSeeBigList (unsigned NumUsrs,const char *OnSubmit) +static void Usr_PutButtonToConfirmIWantToSeeBigList (unsigned NumUsrs, + void (*FuncParams) (), + const char *OnSubmit) { extern const char *Txt_The_list_of_X_users_is_too_large_to_be_displayed; extern const char *Txt_Show_anyway; /***** Show alert and button to confirm that I want to see the big list *****/ + Usr_FuncParamsBigList = FuncParams; // Used to pass pointer to function Ale_ShowAlertAndButton (Gbl.Action.Act,Usr_USER_LIST_SECTION_ID,OnSubmit, Usr_PutParamsConfirmIWantToSeeBigList, Btn_CONFIRM_BUTTON,Txt_Show_anyway, @@ -5628,7 +5638,8 @@ static void Usr_PutParamsConfirmIWantToSeeBigList (void) { Grp_PutParamsCodGrps (); Usr_PutParamsPrefsAboutUsrList (); - Usr_PutExtraParamsUsrList (Gbl.Action.Act); + if (Usr_FuncParamsBigList) + Usr_FuncParamsBigList (); Par_PutHiddenParamChar ("ShowBigList",'Y'); } @@ -6003,7 +6014,7 @@ void Usr_FreeListOtherRecipients (void) /*************************** Selection of list type **************************/ /*****************************************************************************/ -void Usr_ShowFormsToSelectUsrListType (Act_Action_t NextAction) +void Usr_ShowFormsToSelectUsrListType (Act_Action_t NextAction,void (*FuncParams) ()) { Set_StartSettingsHead (); Set_StartOneSettingSelector (); @@ -6012,15 +6023,16 @@ void Usr_ShowFormsToSelectUsrListType (Act_Action_t NextAction) fprintf (Gbl.F.Out,"
", Gbl.Usrs.Me.ListType == Usr_LIST_AS_CLASS_PHOTO ? "PREF_ON" : "PREF_OFF"); - Usr_FormToSelectUsrListType (NextAction,Usr_LIST_AS_CLASS_PHOTO); + Usr_FormToSelectUsrListType (NextAction,FuncParams,Usr_LIST_AS_CLASS_PHOTO); /* Number of columns in the class photo */ Frm_StartFormAnchor (NextAction,Usr_USER_LIST_SECTION_ID); Grp_PutParamsCodGrps (); Usr_PutParamUsrListType (Usr_LIST_AS_CLASS_PHOTO); Usr_PutParamListWithPhotos (); - Usr_PutExtraParamsUsrList (NextAction); Usr_PutSelectorNumColsClassPhoto (); + if (FuncParams) + FuncParams (); Frm_EndForm (); fprintf (Gbl.F.Out,"
"); @@ -6028,13 +6040,14 @@ void Usr_ShowFormsToSelectUsrListType (Act_Action_t NextAction) fprintf (Gbl.F.Out,"
", Gbl.Usrs.Me.ListType == Usr_LIST_AS_LISTING ? "PREF_ON" : "PREF_OFF"); - Usr_FormToSelectUsrListType (NextAction,Usr_LIST_AS_LISTING); + Usr_FormToSelectUsrListType (NextAction,FuncParams,Usr_LIST_AS_LISTING); /* See the photos in list? */ Frm_StartFormAnchor (NextAction,Usr_USER_LIST_SECTION_ID); Grp_PutParamsCodGrps (); Usr_PutParamUsrListType (Usr_LIST_AS_LISTING); - Usr_PutExtraParamsUsrList (NextAction); + if (FuncParams) + FuncParams (); Usr_PutCheckboxListWithPhotos (); Frm_EndForm (); fprintf (Gbl.F.Out,"
"); @@ -6047,7 +6060,8 @@ void Usr_ShowFormsToSelectUsrListType (Act_Action_t NextAction) /************* Put a radio element to select a users' list type **************/ /*****************************************************************************/ -static void Usr_FormToSelectUsrListType (Act_Action_t NextAction,Usr_ShowUsrsType_t ListType) +static void Usr_FormToSelectUsrListType (Act_Action_t NextAction,void (*FuncParams) (), + Usr_ShowUsrsType_t ListType) { extern const char *The_ClassFormInBoxNoWrap[The_NUM_THEMES]; extern const char *Txt_USR_LIST_TYPES[Usr_NUM_USR_LIST_TYPES]; @@ -6057,7 +6071,8 @@ static void Usr_FormToSelectUsrListType (Act_Action_t NextAction,Usr_ShowUsrsTyp Grp_PutParamsCodGrps (); Usr_PutParamUsrListType (ListType); Usr_PutParamListWithPhotos (); - Usr_PutExtraParamsUsrList (NextAction); + if (FuncParams) + FuncParams (); /***** Link and image *****/ Frm_LinkFormSubmit (Txt_USR_LIST_TYPES[ListType], @@ -6078,59 +6093,12 @@ static void Usr_FormToSelectUsrListType (Act_Action_t NextAction,Usr_ShowUsrsTyp Frm_EndForm (); } -/*****************************************************************************/ -/***************** Put extra parameters for a list of users ******************/ -/*****************************************************************************/ - -void Usr_PutExtraParamsUsrList (Act_Action_t NextAction) - { - switch (Gbl.Action.Act) - { - case ActLstGst: - case ActLstStd: - case ActLstTch: - Sco_PutParamScope ("ScopeUsr",Gbl.Scope.Current); - break; - case ActSeeOneAtt: - case ActRecAttStd: - Att_PutParamAttCod (Gbl.AttEvents.AttCod); - break; - case ActReqMsgUsr: - Usr_PutHiddenParUsrCodAll (NextAction,Gbl.Usrs.Selected.List[Rol_UNK]); - Msg_PutHiddenParamOtherRecipients (); - Msg_PutHiddenParamsSubjectAndContent (); - if (Gbl.Msg.Reply.IsReply) - { - Par_PutHiddenParamChar ("IsReply",'Y'); - Msg_PutHiddenParamMsgCod (Gbl.Msg.Reply.OriginalMsgCod); - } - if (Gbl.Usrs.Other.UsrDat.UsrCod > 0) - { - Usr_PutParamOtherUsrCodEncrypted (); - if (Gbl.Msg.ShowOnlyOneRecipient) - Par_PutHiddenParamChar ("ShowOnlyOneRecipient",'Y'); - } - break; - case ActSeeUseGbl: - /* Used in selector of "Class photo"/"List" - in STATS > Figures > Institutions */ - Fig_PutHiddenParamFigures (); - break; - case ActSeePhoDeg: - Pho_PutHiddenParamTypeOfAvg (); - Pho_PutHiddenParamPhotoSize (); - Pho_PutHiddenParamOrderDegrees (); - break; - default: - break; - } - } - /*****************************************************************************/ /******************** List users to select some of them **********************/ /*****************************************************************************/ -void Usr_PutFormToSelectUsrsToGoToAct (Act_Action_t NextAction, +void Usr_PutFormToSelectUsrsToGoToAct (Act_Action_t CurrAction,void (*FuncParamsCurrAction) (), + Act_Action_t NextAction,void (*FuncParamsNextAction) (), const char *HelpLink, const char *TxtButton) { @@ -6157,23 +6125,26 @@ void Usr_PutFormToSelectUsrsToGoToAct (Act_Action_t NextAction, Box_StartBox (NULL,Txt_Users,NULL,HelpLink,Box_NOT_CLOSABLE); /***** Show form to select the groups *****/ - Grp_ShowFormToSelectSeveralGroups (NextAction,Grp_ONLY_MY_GROUPS); + Grp_ShowFormToSelectSeveralGroups (CurrAction,FuncParamsCurrAction, + Grp_ONLY_MY_GROUPS); /***** Start section with user list *****/ Lay_StartSection (Usr_USER_LIST_SECTION_ID); if (NumTotalUsrs) { - if (Usr_GetIfShowBigList (NumTotalUsrs,NULL)) + if (Usr_GetIfShowBigList (NumTotalUsrs,FuncParamsCurrAction,NULL)) { /* Form to select type of list used for select several users */ - Usr_ShowFormsToSelectUsrListType (ActReqAsgWrkCrs); + Usr_ShowFormsToSelectUsrListType (CurrAction,FuncParamsCurrAction); /***** Put link to register students *****/ Enr_CheckStdsAndPutButtonToRegisterStdsInCurrentCrs (); /* Start form */ - Frm_StartForm (ActAdmAsgWrkCrs); + Frm_StartForm (NextAction); + if (FuncParamsNextAction) + FuncParamsNextAction (); Grp_PutParamsCodGrps (); Gbl.FileBrowser.FullTree = true; // By default, show all files Brw_PutHiddenParamFullTreeIfSelected (); @@ -6214,6 +6185,29 @@ void Usr_PutFormToSelectUsrsToGoToAct (Act_Action_t NextAction, Grp_FreeListCodSelectedGrps (); } +void Usr_GetSelectedUsrsAndGoToAct (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 (); + + /***** Check number of users *****/ + if (Usr_CountNumUsrsInListOfSelectedUsrs ()) // If some users are selected... + FuncWhenUsrsSelected (); + else // If no users are selected... + { + // ...write warning alert + Ale_ShowAlert (Ale_WARNING,Txt_You_must_select_one_ore_more_users); + // ...and show again the form + FuncWhenNoUsrsSelected (); + } + + /***** Free memory used by list of selected users' codes *****/ + Usr_FreeListsSelectedUsrsCods (); + } + /*****************************************************************************/ /*********** List users with a given role to select some of them *************/ /*****************************************************************************/ @@ -7314,7 +7308,7 @@ void Usr_ListDataAdms (void) fprintf (Gbl.F.Out,"
"); Frm_StartForm (ActLstOth); - Sco_PutParamScope ("ScopeUsr",Gbl.Scope.Current); + Sco_PutParamCurrentScope (); Usr_PutCheckboxListWithPhotos (); Frm_EndForm (); fprintf (Gbl.F.Out,"
"); @@ -7788,13 +7782,14 @@ void Usr_SeeGuests (void) if (Gbl.Usrs.LstUsrs[Rol_GST].NumUsrs) { - if (Usr_GetIfShowBigList (Gbl.Usrs.LstUsrs[Rol_GST].NumUsrs,NULL)) + if (Usr_GetIfShowBigList (Gbl.Usrs.LstUsrs[Rol_GST].NumUsrs, + Sco_PutParamCurrentScope,NULL)) { /***** Get list of selected users *****/ Usr_GetListsSelectedUsrsCods (); /***** Form to select type of list of users *****/ - Usr_ShowFormsToSelectUsrListType (ActLstGst); + Usr_ShowFormsToSelectUsrListType (ActLstGst,Sco_PutParamCurrentScope); /***** Draw a class photo with guests *****/ if (Gbl.Usrs.Me.ListType == Usr_LIST_AS_CLASS_PHOTO) @@ -7941,20 +7936,22 @@ void Usr_SeeStudents (void) /***** Form to select groups *****/ if (Gbl.Scope.Current == Hie_CRS) - Grp_ShowFormToSelectSeveralGroups (ActLstStd,Grp_ONLY_MY_GROUPS); + Grp_ShowFormToSelectSeveralGroups (ActLstStd,Sco_PutParamCurrentScope, + Grp_ONLY_MY_GROUPS); /***** Start section with user list *****/ Lay_StartSection (Usr_USER_LIST_SECTION_ID); if (Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs) { - if (Usr_GetIfShowBigList (Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs,NULL)) + if (Usr_GetIfShowBigList (Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs, + Sco_PutParamCurrentScope,NULL)) { /***** Get list of selected users *****/ Usr_GetListsSelectedUsrsCods (); /***** Form to select type of list of users *****/ - Usr_ShowFormsToSelectUsrListType (ActLstStd); + Usr_ShowFormsToSelectUsrListType (ActLstStd,Sco_PutParamCurrentScope); /***** Draw a class photo with students of the course *****/ if (Gbl.Usrs.Me.ListType == Usr_LIST_AS_CLASS_PHOTO) @@ -8116,17 +8113,19 @@ void Usr_SeeTeachers (void) /***** Form to select groups *****/ if (Gbl.Scope.Current == Hie_CRS) - Grp_ShowFormToSelectSeveralGroups (ActLstTch,Grp_ONLY_MY_GROUPS); + Grp_ShowFormToSelectSeveralGroups (ActLstTch,Sco_PutParamCurrentScope, + Grp_ONLY_MY_GROUPS); /***** Start section with user list *****/ Lay_StartSection (Usr_USER_LIST_SECTION_ID); if (NumUsrs) { - if (Usr_GetIfShowBigList (NumUsrs,NULL)) + if (Usr_GetIfShowBigList (NumUsrs, + Sco_PutParamCurrentScope,NULL)) { /***** Form to select type of list of users *****/ - Usr_ShowFormsToSelectUsrListType (ActLstTch); + Usr_ShowFormsToSelectUsrListType (ActLstTch,Sco_PutParamCurrentScope); /***** Draw a class photo with teachers of the course *****/ if (Gbl.Usrs.Me.ListType == Usr_LIST_AS_CLASS_PHOTO) @@ -8643,21 +8642,18 @@ static void Usr_PutIconToShowTchsAllData (void) static void Usr_ShowGstsAllDataParams (void) { Usr_PutParamListWithPhotos (); - Usr_PutExtraParamsUsrList (ActLstGstAll); } static void Usr_ShowStdsAllDataParams (void) { Grp_PutParamsCodGrps (); Usr_PutParamListWithPhotos (); - Usr_PutExtraParamsUsrList (ActLstStdAll); } static void Usr_ShowTchsAllDataParams (void) { - Sco_PutParamScope ("ScopeUsr",Gbl.Scope.Current); + Sco_PutParamCurrentScope (); Usr_PutParamListWithPhotos (); - Usr_PutExtraParamsUsrList (ActLstTchAll); } /*****************************************************************************/ diff --git a/swad_user.h b/swad_user.h index 7c4c8122..31f5688d 100644 --- a/swad_user.h +++ b/swad_user.h @@ -407,7 +407,9 @@ void Usr_GetUnorderedStdsCodesInDeg (long DegCod); void Usr_CopyBasicUsrDataFromList (struct UsrData *UsrDat,const struct UsrInList *UsrInList); void Usr_FreeUsrsList (Rol_Role_t Role); -bool Usr_GetIfShowBigList (unsigned NumUsrs,const char *OnSubmit); +bool Usr_GetIfShowBigList (unsigned NumUsrs, + void (*FuncParams) (), + const char *OnSubmit); void Usr_PutHiddenParUsrCodAll (Act_Action_t NextAction,const char *ListUsrCods); void Usr_GetListsSelectedUsrsCods (void); @@ -417,16 +419,18 @@ unsigned Usr_CountNumUsrsInListOfSelectedUsrs (void); void Usr_FreeListsSelectedUsrsCods (void); void Usr_FreeListOtherRecipients (void); -void Usr_ShowFormsToSelectUsrListType (Act_Action_t NextAction); +void Usr_ShowFormsToSelectUsrListType (Act_Action_t NextAction,void (*FuncParams) ()); void Usr_PutCheckboxToSelectAllUsers (Rol_Role_t Role); unsigned Usr_GetColumnsForSelectUsrs (void); void Usr_SetUsrDatMainFieldNames (void); void Usr_WriteHeaderFieldsUsrDat (bool PutCheckBoxToSelectUsr); -void Usr_PutExtraParamsUsrList (Act_Action_t NextAction); -void Usr_PutFormToSelectUsrsToGoToAct (Act_Action_t NextAction, +void Usr_PutFormToSelectUsrsToGoToAct (Act_Action_t CurrAction,void (*FuncParamsCurrAction) (), + Act_Action_t NextAction,void (*FuncParamsNextAction) (), const char *HelpLink, const char *TxtButton); +void Usr_GetSelectedUsrsAndGoToAct (void (*FuncWhenUsrsSelected) (), + void (*FuncWhenNoUsrsSelected) ()); void Usr_ListUsersToSelect (Rol_Role_t Role); void Usr_ListAllDataGsts (void);