Version18.73

This commit is contained in:
Antonio Cañas Vargas 2019-03-12 01:46:40 +01:00
parent 4d12f8ee3a
commit 7bab0fd794
9 changed files with 855 additions and 238 deletions

View File

@ -1012,9 +1012,7 @@ void ID_ConfirmOtherUsrID (void)
check if he/she has accepted */ check if he/she has accepted */
if (Gbl.CurrentCrs.Crs.CrsCod > 0) if (Gbl.CurrentCrs.Crs.CrsCod > 0)
if (Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs.Role == Rol_STD) if (Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs.Role == Rol_STD)
Gbl.Usrs.Other.UsrDat.Accepted = Usr_CheckIfUsrBelongsToCrs (Gbl.Usrs.Other.UsrDat.UsrCod, Gbl.Usrs.Other.UsrDat.Accepted = Usr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
Gbl.CurrentCrs.Crs.CrsCod,
true);
if (ID_ICanSeeOtherUsrIDs (&Gbl.Usrs.Other.UsrDat)) if (ID_ICanSeeOtherUsrIDs (&Gbl.Usrs.Other.UsrDat))
ICanConfirm = true; ICanConfirm = true;

View File

@ -1287,6 +1287,15 @@ Users:
1085. ActLstSimUsr List users similar to a given one (possible duplicates) 1085. ActLstSimUsr List users similar to a given one (possible duplicates)
1086. ActRemDupUsr Remove user from list of possible duplicate users 1086. ActRemDupUsr Remove user from list of possible duplicate users
NEW. ActReqFolSevStd Request follow several students
NEW. ActReqFolSevTch Request follow several teachers
NEW. ActReqUnfSevStd Request unfollow several students
NEW. ActReqUnfSevTch Request unfollow several teachers
NEW. ActFolSevStd Follow several students
NEW. ActFolSevTch Follow several teachers
NEW. ActUnfSevStd Unfollow several students
NEW. ActUnfSevTch Unfollow several teachers
Messages: Messages:
1087. ActSeeAnn Show global announcements 1087. ActSeeAnn Show global announcements
1088. ActSeeAllNot Show all notices 1088. ActSeeAllNot Show all notices
@ -2836,6 +2845,15 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActLstSimUsr */{1579,-1,TabUnk,ActLstOth ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Dup_GetUsrCodAndListSimilarUsrs,NULL}, /* ActLstSimUsr */{1579,-1,TabUnk,ActLstOth ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Dup_GetUsrCodAndListSimilarUsrs,NULL},
/* ActRemDupUsr */{1580,-1,TabUnk,ActLstOth ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Dup_RemoveUsrFromListDupUsrs ,NULL}, /* ActRemDupUsr */{1580,-1,TabUnk,ActLstOth ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Dup_RemoveUsrFromListDupUsrs ,NULL},
/* ActReqFolSevStd */{1756,-1,TabUnk,ActLstStd ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Fol_RequestFollowStds ,NULL},
/* ActReqFolSevTch */{1757,-1,TabUnk,ActLstTch ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Fol_RequestFollowTchs ,NULL},
/* ActReqUnfSevStd */{1758,-1,TabUnk,ActLstStd ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Fol_RequestUnfollowStds ,NULL},
/* ActReqUnfSevTch */{1759,-1,TabUnk,ActLstTch ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Fol_RequestUnfollowTchs ,NULL},
/* ActFolSevStd */{1760,-1,TabUnk,ActLstStd ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Fol_FollowUsrs ,NULL},
/* ActFolSevTch */{1761,-1,TabUnk,ActLstTch ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Fol_FollowUsrs ,NULL},
/* ActUnfSevStd */{1762,-1,TabUnk,ActLstStd ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Fol_UnfollowUsrs ,NULL},
/* ActUnfSevTch */{1763,-1,TabUnk,ActLstTch ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Fol_UnfollowUsrs ,NULL},
// TabMsg ****************************************************************** // TabMsg ******************************************************************
// Actions in menu: // Actions in menu:
/* ActSeeAnn */{1235, 0,TabMsg,ActSeeAnn ,0x3F8,0x3C7,0x3C7,0x3C7,0x3C7,0x3C7,0x3C7,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Ann_ShowAllAnnouncements ,"bullhorn" }, /* ActSeeAnn */{1235, 0,TabMsg,ActSeeAnn ,0x3F8,0x3C7,0x3C7,0x3C7,0x3C7,0x3C7,0x3C7,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Ann_ShowAllAnnouncements ,"bullhorn" },
@ -4892,6 +4910,14 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActDoActOnSevGst, // #1753 ActDoActOnSevGst, // #1753
ActDoActOnSevStd, // #1754 ActDoActOnSevStd, // #1754
ActDoActOnSevTch, // #1755 ActDoActOnSevTch, // #1755
ActReqFolSevStd, // #1756
ActReqFolSevTch, // #1757
ActReqUnfSevStd, // #1758
ActReqUnfSevTch, // #1759
ActFolSevStd, // #1760
ActFolSevTch, // #1761
ActUnfSevStd, // #1762
ActUnfSevTch, // #1763
}; };
/*****************************************************************************/ /*****************************************************************************/

View File

@ -61,9 +61,9 @@ typedef enum
typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action
#define Act_NUM_ACTIONS (1 + 8 + 55 + 38 + 12 + 42 + 36 + 19 + 110 + 157 + 437 + 168 + 168 + 15 + 65) #define Act_NUM_ACTIONS (1 + 8 + 55 + 38 + 12 + 42 + 36 + 19 + 110 + 157 + 437 + 176 + 168 + 15 + 65)
#define Act_MAX_ACTION_COD 1755 #define Act_MAX_ACTION_COD 1763
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13
@ -1310,182 +1310,191 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
#define ActLstSimUsr (ActRemOldBrf + 167) #define ActLstSimUsr (ActRemOldBrf + 167)
#define ActRemDupUsr (ActRemOldBrf + 168) #define ActRemDupUsr (ActRemOldBrf + 168)
#define ActReqFolSevStd (ActRemOldBrf + 169)
#define ActReqFolSevTch (ActRemOldBrf + 170)
#define ActReqUnfSevStd (ActRemOldBrf + 171)
#define ActReqUnfSevTch (ActRemOldBrf + 172)
#define ActFolSevStd (ActRemOldBrf + 173)
#define ActFolSevTch (ActRemOldBrf + 174)
#define ActUnfSevStd (ActRemOldBrf + 175)
#define ActUnfSevTch (ActRemOldBrf + 176)
/*****************************************************************************/ /*****************************************************************************/
/******************************* Messages tab ********************************/ /******************************* Messages tab ********************************/
/*****************************************************************************/ /*****************************************************************************/
// Actions in menu // Actions in menu
#define ActSeeAnn (ActRemDupUsr + 1) #define ActSeeAnn (ActUnfSevTch + 1)
#define ActSeeAllNot (ActRemDupUsr + 2) #define ActSeeAllNot (ActUnfSevTch + 2)
#define ActSeeFor (ActRemDupUsr + 3) #define ActSeeFor (ActUnfSevTch + 3)
#define ActSeeChtRms (ActRemDupUsr + 4) #define ActSeeChtRms (ActUnfSevTch + 4)
#define ActReqMsgUsr (ActRemDupUsr + 5) #define ActReqMsgUsr (ActUnfSevTch + 5)
#define ActSeeRcvMsg (ActRemDupUsr + 6) #define ActSeeRcvMsg (ActUnfSevTch + 6)
#define ActSeeSntMsg (ActRemDupUsr + 7) #define ActSeeSntMsg (ActUnfSevTch + 7)
#define ActMaiStd (ActRemDupUsr + 8) #define ActMaiStd (ActUnfSevTch + 8)
// Secondary actions // Secondary actions
#define ActWriAnn (ActRemDupUsr + 9) #define ActWriAnn (ActUnfSevTch + 9)
#define ActRcvAnn (ActRemDupUsr + 10) #define ActRcvAnn (ActUnfSevTch + 10)
#define ActHidAnn (ActRemDupUsr + 11) #define ActHidAnn (ActUnfSevTch + 11)
#define ActRevAnn (ActRemDupUsr + 12) #define ActRevAnn (ActUnfSevTch + 12)
#define ActRemAnn (ActRemDupUsr + 13) #define ActRemAnn (ActUnfSevTch + 13)
#define ActSeeOneNot (ActRemDupUsr + 14) #define ActSeeOneNot (ActUnfSevTch + 14)
#define ActWriNot (ActRemDupUsr + 15) #define ActWriNot (ActUnfSevTch + 15)
#define ActRcvNot (ActRemDupUsr + 16) #define ActRcvNot (ActUnfSevTch + 16)
#define ActHidNot (ActRemDupUsr + 17) #define ActHidNot (ActUnfSevTch + 17)
#define ActRevNot (ActRemDupUsr + 18) #define ActRevNot (ActUnfSevTch + 18)
#define ActReqRemNot (ActRemDupUsr + 19) #define ActReqRemNot (ActUnfSevTch + 19)
#define ActRemNot (ActRemDupUsr + 20) #define ActRemNot (ActUnfSevTch + 20)
#define ActSeeForCrsUsr (ActRemDupUsr + 21) #define ActSeeForCrsUsr (ActUnfSevTch + 21)
#define ActSeeForCrsTch (ActRemDupUsr + 22) #define ActSeeForCrsTch (ActUnfSevTch + 22)
#define ActSeeForDegUsr (ActRemDupUsr + 23) #define ActSeeForDegUsr (ActUnfSevTch + 23)
#define ActSeeForDegTch (ActRemDupUsr + 24) #define ActSeeForDegTch (ActUnfSevTch + 24)
#define ActSeeForCtrUsr (ActRemDupUsr + 25) #define ActSeeForCtrUsr (ActUnfSevTch + 25)
#define ActSeeForCtrTch (ActRemDupUsr + 26) #define ActSeeForCtrTch (ActUnfSevTch + 26)
#define ActSeeForInsUsr (ActRemDupUsr + 27) #define ActSeeForInsUsr (ActUnfSevTch + 27)
#define ActSeeForInsTch (ActRemDupUsr + 28) #define ActSeeForInsTch (ActUnfSevTch + 28)
#define ActSeeForGenUsr (ActRemDupUsr + 29) #define ActSeeForGenUsr (ActUnfSevTch + 29)
#define ActSeeForGenTch (ActRemDupUsr + 30) #define ActSeeForGenTch (ActUnfSevTch + 30)
#define ActSeeForSWAUsr (ActRemDupUsr + 31) #define ActSeeForSWAUsr (ActUnfSevTch + 31)
#define ActSeeForSWATch (ActRemDupUsr + 32) #define ActSeeForSWATch (ActUnfSevTch + 32)
#define ActSeePstForCrsUsr (ActRemDupUsr + 33) #define ActSeePstForCrsUsr (ActUnfSevTch + 33)
#define ActSeePstForCrsTch (ActRemDupUsr + 34) #define ActSeePstForCrsTch (ActUnfSevTch + 34)
#define ActSeePstForDegUsr (ActRemDupUsr + 35) #define ActSeePstForDegUsr (ActUnfSevTch + 35)
#define ActSeePstForDegTch (ActRemDupUsr + 36) #define ActSeePstForDegTch (ActUnfSevTch + 36)
#define ActSeePstForCtrUsr (ActRemDupUsr + 37) #define ActSeePstForCtrUsr (ActUnfSevTch + 37)
#define ActSeePstForCtrTch (ActRemDupUsr + 38) #define ActSeePstForCtrTch (ActUnfSevTch + 38)
#define ActSeePstForInsUsr (ActRemDupUsr + 39) #define ActSeePstForInsUsr (ActUnfSevTch + 39)
#define ActSeePstForInsTch (ActRemDupUsr + 40) #define ActSeePstForInsTch (ActUnfSevTch + 40)
#define ActSeePstForGenUsr (ActRemDupUsr + 41) #define ActSeePstForGenUsr (ActUnfSevTch + 41)
#define ActSeePstForGenTch (ActRemDupUsr + 42) #define ActSeePstForGenTch (ActUnfSevTch + 42)
#define ActSeePstForSWAUsr (ActRemDupUsr + 43) #define ActSeePstForSWAUsr (ActUnfSevTch + 43)
#define ActSeePstForSWATch (ActRemDupUsr + 44) #define ActSeePstForSWATch (ActUnfSevTch + 44)
#define ActRcvThrForCrsUsr (ActRemDupUsr + 45) #define ActRcvThrForCrsUsr (ActUnfSevTch + 45)
#define ActRcvThrForCrsTch (ActRemDupUsr + 46) #define ActRcvThrForCrsTch (ActUnfSevTch + 46)
#define ActRcvThrForDegUsr (ActRemDupUsr + 47) #define ActRcvThrForDegUsr (ActUnfSevTch + 47)
#define ActRcvThrForDegTch (ActRemDupUsr + 48) #define ActRcvThrForDegTch (ActUnfSevTch + 48)
#define ActRcvThrForCtrUsr (ActRemDupUsr + 49) #define ActRcvThrForCtrUsr (ActUnfSevTch + 49)
#define ActRcvThrForCtrTch (ActRemDupUsr + 50) #define ActRcvThrForCtrTch (ActUnfSevTch + 50)
#define ActRcvThrForInsUsr (ActRemDupUsr + 51) #define ActRcvThrForInsUsr (ActUnfSevTch + 51)
#define ActRcvThrForInsTch (ActRemDupUsr + 52) #define ActRcvThrForInsTch (ActUnfSevTch + 52)
#define ActRcvThrForGenUsr (ActRemDupUsr + 53) #define ActRcvThrForGenUsr (ActUnfSevTch + 53)
#define ActRcvThrForGenTch (ActRemDupUsr + 54) #define ActRcvThrForGenTch (ActUnfSevTch + 54)
#define ActRcvThrForSWAUsr (ActRemDupUsr + 55) #define ActRcvThrForSWAUsr (ActUnfSevTch + 55)
#define ActRcvThrForSWATch (ActRemDupUsr + 56) #define ActRcvThrForSWATch (ActUnfSevTch + 56)
#define ActRcvRepForCrsUsr (ActRemDupUsr + 57) #define ActRcvRepForCrsUsr (ActUnfSevTch + 57)
#define ActRcvRepForCrsTch (ActRemDupUsr + 58) #define ActRcvRepForCrsTch (ActUnfSevTch + 58)
#define ActRcvRepForDegUsr (ActRemDupUsr + 59) #define ActRcvRepForDegUsr (ActUnfSevTch + 59)
#define ActRcvRepForDegTch (ActRemDupUsr + 60) #define ActRcvRepForDegTch (ActUnfSevTch + 60)
#define ActRcvRepForCtrUsr (ActRemDupUsr + 61) #define ActRcvRepForCtrUsr (ActUnfSevTch + 61)
#define ActRcvRepForCtrTch (ActRemDupUsr + 62) #define ActRcvRepForCtrTch (ActUnfSevTch + 62)
#define ActRcvRepForInsUsr (ActRemDupUsr + 63) #define ActRcvRepForInsUsr (ActUnfSevTch + 63)
#define ActRcvRepForInsTch (ActRemDupUsr + 64) #define ActRcvRepForInsTch (ActUnfSevTch + 64)
#define ActRcvRepForGenUsr (ActRemDupUsr + 65) #define ActRcvRepForGenUsr (ActUnfSevTch + 65)
#define ActRcvRepForGenTch (ActRemDupUsr + 66) #define ActRcvRepForGenTch (ActUnfSevTch + 66)
#define ActRcvRepForSWAUsr (ActRemDupUsr + 67) #define ActRcvRepForSWAUsr (ActUnfSevTch + 67)
#define ActRcvRepForSWATch (ActRemDupUsr + 68) #define ActRcvRepForSWATch (ActUnfSevTch + 68)
#define ActReqDelThrCrsUsr (ActRemDupUsr + 69) #define ActReqDelThrCrsUsr (ActUnfSevTch + 69)
#define ActReqDelThrCrsTch (ActRemDupUsr + 70) #define ActReqDelThrCrsTch (ActUnfSevTch + 70)
#define ActReqDelThrDegUsr (ActRemDupUsr + 71) #define ActReqDelThrDegUsr (ActUnfSevTch + 71)
#define ActReqDelThrDegTch (ActRemDupUsr + 72) #define ActReqDelThrDegTch (ActUnfSevTch + 72)
#define ActReqDelThrCtrUsr (ActRemDupUsr + 73) #define ActReqDelThrCtrUsr (ActUnfSevTch + 73)
#define ActReqDelThrCtrTch (ActRemDupUsr + 74) #define ActReqDelThrCtrTch (ActUnfSevTch + 74)
#define ActReqDelThrInsUsr (ActRemDupUsr + 75) #define ActReqDelThrInsUsr (ActUnfSevTch + 75)
#define ActReqDelThrInsTch (ActRemDupUsr + 76) #define ActReqDelThrInsTch (ActUnfSevTch + 76)
#define ActReqDelThrGenUsr (ActRemDupUsr + 77) #define ActReqDelThrGenUsr (ActUnfSevTch + 77)
#define ActReqDelThrGenTch (ActRemDupUsr + 78) #define ActReqDelThrGenTch (ActUnfSevTch + 78)
#define ActReqDelThrSWAUsr (ActRemDupUsr + 79) #define ActReqDelThrSWAUsr (ActUnfSevTch + 79)
#define ActReqDelThrSWATch (ActRemDupUsr + 80) #define ActReqDelThrSWATch (ActUnfSevTch + 80)
#define ActDelThrForCrsUsr (ActRemDupUsr + 81) #define ActDelThrForCrsUsr (ActUnfSevTch + 81)
#define ActDelThrForCrsTch (ActRemDupUsr + 82) #define ActDelThrForCrsTch (ActUnfSevTch + 82)
#define ActDelThrForDegUsr (ActRemDupUsr + 83) #define ActDelThrForDegUsr (ActUnfSevTch + 83)
#define ActDelThrForDegTch (ActRemDupUsr + 84) #define ActDelThrForDegTch (ActUnfSevTch + 84)
#define ActDelThrForCtrUsr (ActRemDupUsr + 85) #define ActDelThrForCtrUsr (ActUnfSevTch + 85)
#define ActDelThrForCtrTch (ActRemDupUsr + 86) #define ActDelThrForCtrTch (ActUnfSevTch + 86)
#define ActDelThrForInsUsr (ActRemDupUsr + 87) #define ActDelThrForInsUsr (ActUnfSevTch + 87)
#define ActDelThrForInsTch (ActRemDupUsr + 88) #define ActDelThrForInsTch (ActUnfSevTch + 88)
#define ActDelThrForGenUsr (ActRemDupUsr + 89) #define ActDelThrForGenUsr (ActUnfSevTch + 89)
#define ActDelThrForGenTch (ActRemDupUsr + 90) #define ActDelThrForGenTch (ActUnfSevTch + 90)
#define ActDelThrForSWAUsr (ActRemDupUsr + 91) #define ActDelThrForSWAUsr (ActUnfSevTch + 91)
#define ActDelThrForSWATch (ActRemDupUsr + 92) #define ActDelThrForSWATch (ActUnfSevTch + 92)
#define ActCutThrForCrsUsr (ActRemDupUsr + 93) #define ActCutThrForCrsUsr (ActUnfSevTch + 93)
#define ActCutThrForCrsTch (ActRemDupUsr + 94) #define ActCutThrForCrsTch (ActUnfSevTch + 94)
#define ActCutThrForDegUsr (ActRemDupUsr + 95) #define ActCutThrForDegUsr (ActUnfSevTch + 95)
#define ActCutThrForDegTch (ActRemDupUsr + 96) #define ActCutThrForDegTch (ActUnfSevTch + 96)
#define ActCutThrForCtrUsr (ActRemDupUsr + 97) #define ActCutThrForCtrUsr (ActUnfSevTch + 97)
#define ActCutThrForCtrTch (ActRemDupUsr + 98) #define ActCutThrForCtrTch (ActUnfSevTch + 98)
#define ActCutThrForInsUsr (ActRemDupUsr + 99) #define ActCutThrForInsUsr (ActUnfSevTch + 99)
#define ActCutThrForInsTch (ActRemDupUsr + 100) #define ActCutThrForInsTch (ActUnfSevTch + 100)
#define ActCutThrForGenUsr (ActRemDupUsr + 101) #define ActCutThrForGenUsr (ActUnfSevTch + 101)
#define ActCutThrForGenTch (ActRemDupUsr + 102) #define ActCutThrForGenTch (ActUnfSevTch + 102)
#define ActCutThrForSWAUsr (ActRemDupUsr + 103) #define ActCutThrForSWAUsr (ActUnfSevTch + 103)
#define ActCutThrForSWATch (ActRemDupUsr + 104) #define ActCutThrForSWATch (ActUnfSevTch + 104)
#define ActPasThrForCrsUsr (ActRemDupUsr + 105) #define ActPasThrForCrsUsr (ActUnfSevTch + 105)
#define ActPasThrForCrsTch (ActRemDupUsr + 106) #define ActPasThrForCrsTch (ActUnfSevTch + 106)
#define ActPasThrForDegUsr (ActRemDupUsr + 107) #define ActPasThrForDegUsr (ActUnfSevTch + 107)
#define ActPasThrForDegTch (ActRemDupUsr + 108) #define ActPasThrForDegTch (ActUnfSevTch + 108)
#define ActPasThrForCtrUsr (ActRemDupUsr + 109) #define ActPasThrForCtrUsr (ActUnfSevTch + 109)
#define ActPasThrForCtrTch (ActRemDupUsr + 110) #define ActPasThrForCtrTch (ActUnfSevTch + 110)
#define ActPasThrForInsUsr (ActRemDupUsr + 111) #define ActPasThrForInsUsr (ActUnfSevTch + 111)
#define ActPasThrForInsTch (ActRemDupUsr + 112) #define ActPasThrForInsTch (ActUnfSevTch + 112)
#define ActPasThrForGenUsr (ActRemDupUsr + 113) #define ActPasThrForGenUsr (ActUnfSevTch + 113)
#define ActPasThrForGenTch (ActRemDupUsr + 114) #define ActPasThrForGenTch (ActUnfSevTch + 114)
#define ActPasThrForSWAUsr (ActRemDupUsr + 115) #define ActPasThrForSWAUsr (ActUnfSevTch + 115)
#define ActPasThrForSWATch (ActRemDupUsr + 116) #define ActPasThrForSWATch (ActUnfSevTch + 116)
#define ActDelPstForCrsUsr (ActRemDupUsr + 117) #define ActDelPstForCrsUsr (ActUnfSevTch + 117)
#define ActDelPstForCrsTch (ActRemDupUsr + 118) #define ActDelPstForCrsTch (ActUnfSevTch + 118)
#define ActDelPstForDegUsr (ActRemDupUsr + 119) #define ActDelPstForDegUsr (ActUnfSevTch + 119)
#define ActDelPstForDegTch (ActRemDupUsr + 120) #define ActDelPstForDegTch (ActUnfSevTch + 120)
#define ActDelPstForCtrUsr (ActRemDupUsr + 121) #define ActDelPstForCtrUsr (ActUnfSevTch + 121)
#define ActDelPstForCtrTch (ActRemDupUsr + 122) #define ActDelPstForCtrTch (ActUnfSevTch + 122)
#define ActDelPstForInsUsr (ActRemDupUsr + 123) #define ActDelPstForInsUsr (ActUnfSevTch + 123)
#define ActDelPstForInsTch (ActRemDupUsr + 124) #define ActDelPstForInsTch (ActUnfSevTch + 124)
#define ActDelPstForGenUsr (ActRemDupUsr + 125) #define ActDelPstForGenUsr (ActUnfSevTch + 125)
#define ActDelPstForGenTch (ActRemDupUsr + 126) #define ActDelPstForGenTch (ActUnfSevTch + 126)
#define ActDelPstForSWAUsr (ActRemDupUsr + 127) #define ActDelPstForSWAUsr (ActUnfSevTch + 127)
#define ActDelPstForSWATch (ActRemDupUsr + 128) #define ActDelPstForSWATch (ActUnfSevTch + 128)
#define ActEnbPstForCrsUsr (ActRemDupUsr + 129) #define ActEnbPstForCrsUsr (ActUnfSevTch + 129)
#define ActEnbPstForCrsTch (ActRemDupUsr + 130) #define ActEnbPstForCrsTch (ActUnfSevTch + 130)
#define ActEnbPstForDegUsr (ActRemDupUsr + 131) #define ActEnbPstForDegUsr (ActUnfSevTch + 131)
#define ActEnbPstForDegTch (ActRemDupUsr + 132) #define ActEnbPstForDegTch (ActUnfSevTch + 132)
#define ActEnbPstForCtrUsr (ActRemDupUsr + 133) #define ActEnbPstForCtrUsr (ActUnfSevTch + 133)
#define ActEnbPstForCtrTch (ActRemDupUsr + 134) #define ActEnbPstForCtrTch (ActUnfSevTch + 134)
#define ActEnbPstForInsUsr (ActRemDupUsr + 135) #define ActEnbPstForInsUsr (ActUnfSevTch + 135)
#define ActEnbPstForInsTch (ActRemDupUsr + 136) #define ActEnbPstForInsTch (ActUnfSevTch + 136)
#define ActEnbPstForGenUsr (ActRemDupUsr + 137) #define ActEnbPstForGenUsr (ActUnfSevTch + 137)
#define ActEnbPstForGenTch (ActRemDupUsr + 138) #define ActEnbPstForGenTch (ActUnfSevTch + 138)
#define ActEnbPstForSWAUsr (ActRemDupUsr + 139) #define ActEnbPstForSWAUsr (ActUnfSevTch + 139)
#define ActEnbPstForSWATch (ActRemDupUsr + 140) #define ActEnbPstForSWATch (ActUnfSevTch + 140)
#define ActDisPstForCrsUsr (ActRemDupUsr + 141) #define ActDisPstForCrsUsr (ActUnfSevTch + 141)
#define ActDisPstForCrsTch (ActRemDupUsr + 142) #define ActDisPstForCrsTch (ActUnfSevTch + 142)
#define ActDisPstForDegUsr (ActRemDupUsr + 143) #define ActDisPstForDegUsr (ActUnfSevTch + 143)
#define ActDisPstForDegTch (ActRemDupUsr + 144) #define ActDisPstForDegTch (ActUnfSevTch + 144)
#define ActDisPstForCtrUsr (ActRemDupUsr + 145) #define ActDisPstForCtrUsr (ActUnfSevTch + 145)
#define ActDisPstForCtrTch (ActRemDupUsr + 146) #define ActDisPstForCtrTch (ActUnfSevTch + 146)
#define ActDisPstForInsUsr (ActRemDupUsr + 147) #define ActDisPstForInsUsr (ActUnfSevTch + 147)
#define ActDisPstForInsTch (ActRemDupUsr + 148) #define ActDisPstForInsTch (ActUnfSevTch + 148)
#define ActDisPstForGenUsr (ActRemDupUsr + 149) #define ActDisPstForGenUsr (ActUnfSevTch + 149)
#define ActDisPstForGenTch (ActRemDupUsr + 150) #define ActDisPstForGenTch (ActUnfSevTch + 150)
#define ActDisPstForSWAUsr (ActRemDupUsr + 151) #define ActDisPstForSWAUsr (ActUnfSevTch + 151)
#define ActDisPstForSWATch (ActRemDupUsr + 152) #define ActDisPstForSWATch (ActUnfSevTch + 152)
#define ActCht (ActRemDupUsr + 153) #define ActCht (ActUnfSevTch + 153)
#define ActRcvMsgUsr (ActRemDupUsr + 154) #define ActRcvMsgUsr (ActUnfSevTch + 154)
#define ActReqDelAllSntMsg (ActRemDupUsr + 155) #define ActReqDelAllSntMsg (ActUnfSevTch + 155)
#define ActReqDelAllRcvMsg (ActRemDupUsr + 156) #define ActReqDelAllRcvMsg (ActUnfSevTch + 156)
#define ActDelAllSntMsg (ActRemDupUsr + 157) #define ActDelAllSntMsg (ActUnfSevTch + 157)
#define ActDelAllRcvMsg (ActRemDupUsr + 158) #define ActDelAllRcvMsg (ActUnfSevTch + 158)
#define ActDelSntMsg (ActRemDupUsr + 159) #define ActDelSntMsg (ActUnfSevTch + 159)
#define ActDelRcvMsg (ActRemDupUsr + 160) #define ActDelRcvMsg (ActUnfSevTch + 160)
#define ActExpSntMsg (ActRemDupUsr + 161) #define ActExpSntMsg (ActUnfSevTch + 161)
#define ActExpRcvMsg (ActRemDupUsr + 162) #define ActExpRcvMsg (ActUnfSevTch + 162)
#define ActConSntMsg (ActRemDupUsr + 163) #define ActConSntMsg (ActUnfSevTch + 163)
#define ActConRcvMsg (ActRemDupUsr + 164) #define ActConRcvMsg (ActUnfSevTch + 164)
#define ActLstBanUsr (ActRemDupUsr + 165) #define ActLstBanUsr (ActUnfSevTch + 165)
#define ActBanUsrMsg (ActRemDupUsr + 166) #define ActBanUsrMsg (ActUnfSevTch + 166)
#define ActUnbUsrMsg (ActRemDupUsr + 167) #define ActUnbUsrMsg (ActUnfSevTch + 167)
#define ActUnbUsrLst (ActRemDupUsr + 168) #define ActUnbUsrLst (ActUnfSevTch + 168)
/*****************************************************************************/ /*****************************************************************************/
/****************************** Statistics tab *******************************/ /****************************** Statistics tab *******************************/

View File

@ -453,10 +453,30 @@ En OpenSWAD:
ps2pdf source.ps destination.pdf ps2pdf source.ps destination.pdf
*/ */
#define Log_PLATFORM_VERSION "SWAD 18.72.2 (2019-03-11)" #define Log_PLATFORM_VERSION "SWAD 18.73 (2019-03-12)"
#define CSS_FILE "swad18.68.3.css" #define CSS_FILE "swad18.68.3.css"
#define JS_FILE "swad18.64.js" #define JS_FILE "swad18.64.js"
/* /*
Arreglar BUG: RMS no debería poder seleccionar todos los grupos al redactar mensajes
Arreglar BUG: A RMS le sale ACV al listar profesores, pero no al redactar mensajes
Version 18.73: Mar 12, 2019 New actions to follow/unfollow several users. (239658 lines)
14 changes necessary in database:
UPDATE actions SET Txt='Ver fichas profesores' WHERE ActCod='22' AND Language='es';
UPDATE actions SET Txt='Ver fichas estudiantes' WHERE ActCod='89' AND Language='es';
UPDATE actions SET Txt='Ver fichas invitados' WHERE ActCod='1187' AND Language='es';
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1753','es','N','Realizar acción invitados');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1754','es','N','Realizar acción estudiantes');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1755','es','N','Realizar acción profesores');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1756','es','N','Solicitar seguir a estudiantes');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1757','es','N','Solicitar seguir a profesores');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1758','es','N','Solicitar dejar de seguir a estudiantes');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1759','es','N','Solicitar dejar de seguir a profesores');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1760','es','N','Seguir a estudiantes');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1761','es','N','Seguir a profesores');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1762','es','N','Dejar de seguir a estudiantes');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1763','es','N','Dejar de seguir a profesores');
Version 18.72.2: Mar 11, 2019 Create new message from list of users. (239114 lines) Version 18.72.2: Mar 11, 2019 Create new message from list of users. (239114 lines)
Version 18.72.1: Mar 11, 2019 Show attendance list from list of users. (239075 lines) Version 18.72.1: Mar 11, 2019 Show attendance list from list of users. (239075 lines)
Version 18.72: Mar 11, 2019 Show homework from list of students and teachers. (239043 lines) Version 18.72: Mar 11, 2019 Show homework from list of students and teachers. (239043 lines)

View File

@ -89,6 +89,18 @@ static void Fol_PutInactiveIconToFollowUnfollow (void);
static void Fol_PutIconToFollow (struct UsrData *UsrDat); static void Fol_PutIconToFollow (struct UsrData *UsrDat);
static void Fol_PutIconToUnfollow (struct UsrData *UsrDat); static void Fol_PutIconToUnfollow (struct UsrData *UsrDat);
static void Fol_RequestFollowUsrs (Act_Action_t NextAction,void (*FuncParams) ());
static void Fol_RequestUnfollowUsrs (Act_Action_t NextAction,void (*FuncParams) ());
static void Fol_GetFollowedFromSelectedUsrs (unsigned *NumFollowed,
unsigned *NumNotFollowed);
static void Fol_PutParamsFollowSelectedStds (void);
static void Fol_PutParamsFollowSelectedTchs (void);
static void Fol_PutParamsUnfollowSelectedStds (void);
static void Fol_PutParamsUnfollowSelectedTchs (void);
static void Fol_FollowUsr (struct UsrData *UsrDat);
static void Fol_UnfollowUsr (struct UsrData *UsrDat);
/*****************************************************************************/ /*****************************************************************************/
/********************** Put link to show users to follow **********************/ /********************** Put link to show users to follow **********************/
/*****************************************************************************/ /*****************************************************************************/
@ -1009,42 +1021,14 @@ static void Fol_PutIconToUnfollow (struct UsrData *UsrDat)
void Fol_FollowUsr1 (void) void Fol_FollowUsr1 (void)
{ {
bool CreateNotif;
bool NotifyByEmail;
/***** Get user to be followed *****/ /***** Get user to be followed *****/
if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ())
{ {
// Follow only if I can view his/her public profile // Follow only if I do not follow him/her
if (Pri_ShowingIsAllowed (Gbl.Usrs.Other.UsrDat.ProfileVisibility,&Gbl.Usrs.Other.UsrDat)) if (!Fol_CheckUsrIsFollowerOf (Gbl.Usrs.Me.UsrDat.UsrCod,
// Follow only if I do not follow him/her Gbl.Usrs.Other.UsrDat.UsrCod))
if (!Fol_CheckUsrIsFollowerOf (Gbl.Usrs.Me.UsrDat.UsrCod, Fol_FollowUsr (&Gbl.Usrs.Other.UsrDat);
Gbl.Usrs.Other.UsrDat.UsrCod))
{
/***** Follow user in database *****/
DB_QueryREPLACE ("can not follow user",
"REPLACE INTO usr_follow"
" (FollowerCod,FollowedCod,FollowTime)"
" VALUES"
" (%ld,%ld,NOW())",
Gbl.Usrs.Me.UsrDat.UsrCod,
Gbl.Usrs.Other.UsrDat.UsrCod);
/***** Flush cache *****/
Fol_FlushCacheFollow ();
/***** This follow must be notified by email? *****/
CreateNotif = (Gbl.Usrs.Other.UsrDat.Prefs.NotifNtfEvents & (1 << Ntf_EVENT_FOLLOWER));
NotifyByEmail = CreateNotif &&
(Gbl.Usrs.Other.UsrDat.Prefs.EmailNtfEvents & (1 << Ntf_EVENT_FOLLOWER));
/***** Create notification for this followed.
If this followed wants to receive notifications by email, activate the sending of a notification *****/
if (CreateNotif)
Ntf_StoreNotifyEventToOneUser (Ntf_EVENT_FOLLOWER,&Gbl.Usrs.Other.UsrDat,Gbl.Usrs.Me.UsrDat.UsrCod,
(Ntf_Status_t) (NotifyByEmail ? Ntf_STATUS_BIT_EMAIL :
0));
}
Ale_CreateAlert (Ale_SUCCESS,NULL,""); // Txt not used Ale_CreateAlert (Ale_SUCCESS,NULL,""); // Txt not used
} }
else else
@ -1078,17 +1062,8 @@ void Fol_UnfollowUsr1 (void)
// Unfollow only if I follow him/her // Unfollow only if I follow him/her
if (Fol_CheckUsrIsFollowerOf (Gbl.Usrs.Me.UsrDat.UsrCod, if (Fol_CheckUsrIsFollowerOf (Gbl.Usrs.Me.UsrDat.UsrCod,
Gbl.Usrs.Other.UsrDat.UsrCod)) Gbl.Usrs.Other.UsrDat.UsrCod))
{ Fol_UnfollowUsr (&Gbl.Usrs.Other.UsrDat);
/***** Unfollow user in database *****/
DB_QueryREPLACE ("can not unfollow user",
"DELETE FROM usr_follow"
" WHERE FollowerCod=%ld AND FollowedCod=%ld",
Gbl.Usrs.Me.UsrDat.UsrCod,
Gbl.Usrs.Other.UsrDat.UsrCod);
/***** Flush cache *****/
Fol_FlushCacheFollow ();
}
Ale_CreateAlert (Ale_SUCCESS,NULL,""); // Txt not used Ale_CreateAlert (Ale_SUCCESS,NULL,""); // Txt not used
} }
else else
@ -1111,6 +1086,336 @@ void Fol_UnfollowUsr2 (void)
Ale_ShowAlerts (NULL); Ale_ShowAlerts (NULL);
} }
/*****************************************************************************/
/***************** Request follow/unfollow several users *********************/
/*****************************************************************************/
void Fol_RequestFollowStds (void)
{
Fol_RequestFollowUsrs (ActFolSevStd,Fol_PutParamsFollowSelectedStds);
}
void Fol_RequestFollowTchs (void)
{
Fol_RequestFollowUsrs (ActFolSevTch,Fol_PutParamsFollowSelectedTchs);
}
static void Fol_RequestFollowUsrs (Act_Action_t NextAction,void (*FuncParams) ())
{
extern const char *Txt_Follow;
extern const char *Txt_Do_you_want_to_follow_the_selected_user_whom_you_do_not_follow_yet;
extern const char *Txt_Do_you_want_to_follow_the_X_selected_users_whom_you_do_not_follow_yet;
unsigned NumFollowed;
unsigned NumNotFollowed;
// List of selected users is already got
/***** Go through list of selected users
getting the number of followed and not followed ****/
Fol_GetFollowedFromSelectedUsrs (&NumFollowed,&NumNotFollowed);
/***** Show question to confirm ****/
if (NumNotFollowed)
{
if (NumNotFollowed == 1)
Ale_ShowAlertAndButton (NextAction,NULL,NULL,
FuncParams,
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,
FuncParams,
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_FreeListsSelectedUsrsCods ();
}
void Fol_RequestUnfollowStds (void)
{
Fol_RequestUnfollowUsrs (ActUnfSevStd,Fol_PutParamsUnfollowSelectedStds);
}
void Fol_RequestUnfollowTchs (void)
{
Fol_RequestUnfollowUsrs (ActUnfSevTch,Fol_PutParamsUnfollowSelectedTchs);
}
static void Fol_RequestUnfollowUsrs (Act_Action_t NextAction,void (*FuncParams) ())
{
extern const char *Txt_Do_you_want_to_stop_following_the_selected_user_whom_you_follow;
extern const char *Txt_Do_you_want_to_stop_following_the_X_selected_users_whom_you_follow;
extern const char *Txt_Unfollow;
unsigned NumFollowed;
unsigned NumNotFollowed;
// List of selected users is already got
/***** Go through list of selected users
getting the number of followed and not followed ****/
Fol_GetFollowedFromSelectedUsrs (&NumFollowed,&NumNotFollowed);
/***** Show question to confirm ****/
if (NumFollowed)
{
if (NumFollowed == 1)
Ale_ShowAlertAndButton (NextAction,NULL,NULL,
FuncParams,
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,
FuncParams,
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_FreeListsSelectedUsrsCods ();
}
/*****************************************************************************/
/**** Go through the list getting the number of followed and not followed ****/
/*****************************************************************************/
static void Fol_GetFollowedFromSelectedUsrs (unsigned *NumFollowed,
unsigned *NumNotFollowed)
{
extern const char *Txt_Select_users_X_Followed_Y_Not_followed_Z;
struct UsrData UsrDat;
const char *Ptr;
bool IFollowUsr;
unsigned NumUsrs = 0;
/***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat);
/***** Check users to know if I follow them *****/
*NumFollowed = 0;
Ptr = Gbl.Usrs.Selected.List[Rol_UNK];
while (*Ptr)
{
Par_GetNextStrUntilSeparParamMult (&Ptr,UsrDat.EncryptedUsrCod,
Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64);
Usr_GetUsrCodFromEncryptedUsrCod (&UsrDat);
if (Gbl.Usrs.Me.UsrDat.UsrCod != UsrDat.UsrCod) // Skip me
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat)) // Get from the database the data of the student
if (Usr_CheckIfUsrBelongsToCurrentCrs (&UsrDat))
{
/* Check if I follow this user */
IFollowUsr = Fol_CheckUsrIsFollowerOf (Gbl.Usrs.Me.UsrDat.UsrCod,
UsrDat.UsrCod);
/* Update number of users */
if (IFollowUsr)
(*NumFollowed)++;
NumUsrs++;
}
}
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDat);
/***** Show alert ****/
*NumNotFollowed = NumUsrs - *NumFollowed;
Ale_ShowAlert (Ale_INFO,Txt_Select_users_X_Followed_Y_Not_followed_Z,
NumUsrs,*NumFollowed,*NumNotFollowed);
}
/*****************************************************************************/
/********************** Follow/unfollow several users ************************/
/*****************************************************************************/
void Fol_FollowUsrs ()
{
extern const char *Txt_You_have_followed_one_user;
extern const char *Txt_You_have_followed_X_users;
const char *Ptr;
struct UsrData UsrDat;
unsigned NumFollowed = 0;
/***** Get list of selected users if not already got *****/
Usr_GetListsSelectedUsrsCods ();
/***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat);
/***** Check users to know if I follow them *****/
Ptr = Gbl.Usrs.Selected.List[Rol_UNK];
while (*Ptr)
{
Par_GetNextStrUntilSeparParamMult (&Ptr,UsrDat.EncryptedUsrCod,
Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64);
Usr_GetUsrCodFromEncryptedUsrCod (&UsrDat);
if (Gbl.Usrs.Me.UsrDat.UsrCod != UsrDat.UsrCod) // Skip me
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat)) // Get from the database the data of the student
if (Usr_CheckIfUsrBelongsToCurrentCrs (&UsrDat))
/* If I don't follow this user ==> follow him/her */
if (!Fol_CheckUsrIsFollowerOf (Gbl.Usrs.Me.UsrDat.UsrCod,
UsrDat.UsrCod))
{
Fol_FollowUsr (&UsrDat);
NumFollowed++;
}
}
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDat);
/***** Free memory used by list of selected users' codes *****/
Usr_FreeListsSelectedUsrsCods ();
/***** Show alert *****/
if (NumFollowed == 1)
Ale_ShowAlert (Ale_SUCCESS,Txt_You_have_followed_one_user);
else
Ale_ShowAlert (Ale_SUCCESS,Txt_You_have_followed_X_users,
NumFollowed);
}
void Fol_UnfollowUsrs (void)
{
extern const char *Txt_You_have_stopped_following_one_user;
extern const char *Txt_You_have_stopped_following_X_users;
const char *Ptr;
struct UsrData UsrDat;
unsigned NumUnfollowed = 0;
/***** Get list of selected users if not already got *****/
Usr_GetListsSelectedUsrsCods ();
/***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat);
/***** Check users to know if I follow them *****/
Ptr = Gbl.Usrs.Selected.List[Rol_UNK];
while (*Ptr)
{
Par_GetNextStrUntilSeparParamMult (&Ptr,UsrDat.EncryptedUsrCod,
Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64);
Usr_GetUsrCodFromEncryptedUsrCod (&UsrDat);
if (Gbl.Usrs.Me.UsrDat.UsrCod != UsrDat.UsrCod) // Skip me
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat)) // Get from the database the data of the student
if (Usr_CheckIfUsrBelongsToCurrentCrs (&UsrDat))
/* If I follow this user ==> unfollow him/her */
if (Fol_CheckUsrIsFollowerOf (Gbl.Usrs.Me.UsrDat.UsrCod,
UsrDat.UsrCod))
{
Fol_UnfollowUsr (&UsrDat);
NumUnfollowed++;
}
}
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDat);
/***** Free memory used by list of selected users' codes *****/
Usr_FreeListsSelectedUsrsCods ();
/***** Show alert *****/
if (NumUnfollowed == 1)
Ale_ShowAlert (Ale_SUCCESS,Txt_You_have_stopped_following_one_user);
else
Ale_ShowAlert (Ale_SUCCESS,Txt_You_have_stopped_following_X_users,
NumUnfollowed);
}
/*****************************************************************************/
/**************** Put parameter with list of selected users ******************/
/*****************************************************************************/
static void Fol_PutParamsFollowSelectedStds (void)
{
/***** Hidden parameter with the encrypted codes of users selected *****/
Usr_PutHiddenParUsrCodAll (ActFolSevStd,Gbl.Usrs.Selected.List[Rol_UNK]);
}
static void Fol_PutParamsFollowSelectedTchs (void)
{
/***** Hidden parameter with the encrypted codes of users selected *****/
Usr_PutHiddenParUsrCodAll (ActFolSevTch,Gbl.Usrs.Selected.List[Rol_UNK]);
}
static void Fol_PutParamsUnfollowSelectedStds (void)
{
/***** Hidden parameter with the encrypted codes of users selected *****/
Usr_PutHiddenParUsrCodAll (ActUnfSevStd,Gbl.Usrs.Selected.List[Rol_UNK]);
}
static void Fol_PutParamsUnfollowSelectedTchs (void)
{
/***** Hidden parameter with the encrypted codes of users selected *****/
Usr_PutHiddenParUsrCodAll (ActUnfSevTch,Gbl.Usrs.Selected.List[Rol_UNK]);
}
/*****************************************************************************/
/******************************** Follow user ********************************/
/*****************************************************************************/
static void Fol_FollowUsr (struct UsrData *UsrDat)
{
bool CreateNotif;
bool NotifyByEmail;
/***** Avoid wrong cases *****/
if (Gbl.Usrs.Me.UsrDat.UsrCod <= 0 ||
UsrDat->UsrCod <= 0 ||
Gbl.Usrs.Me.UsrDat.UsrCod == UsrDat->UsrCod) // Skip me
return;
/***** Follow user in database *****/
DB_QueryREPLACE ("can not follow user",
"REPLACE INTO usr_follow"
" (FollowerCod,FollowedCod,FollowTime)"
" VALUES"
" (%ld,%ld,NOW())",
Gbl.Usrs.Me.UsrDat.UsrCod,
UsrDat->UsrCod);
/***** Flush cache *****/
Fol_FlushCacheFollow ();
/***** This follow must be notified by email? *****/
CreateNotif = (UsrDat->Prefs.NotifNtfEvents & (1 << Ntf_EVENT_FOLLOWER));
NotifyByEmail = CreateNotif &&
(UsrDat->Prefs.EmailNtfEvents & (1 << Ntf_EVENT_FOLLOWER));
/***** Create notification for this followed.
If this followed wants to receive notifications by email,
activate the sending of a notification *****/
if (CreateNotif)
Ntf_StoreNotifyEventToOneUser (Ntf_EVENT_FOLLOWER,UsrDat,Gbl.Usrs.Me.UsrDat.UsrCod,
(Ntf_Status_t) (NotifyByEmail ? Ntf_STATUS_BIT_EMAIL :
0));
}
/*****************************************************************************/
/******************************* Unfollow user *******************************/
/*****************************************************************************/
static void Fol_UnfollowUsr (struct UsrData *UsrDat)
{
/***** Avoid wrong cases *****/
if (Gbl.Usrs.Me.UsrDat.UsrCod <= 0 ||
UsrDat->UsrCod <= 0 ||
Gbl.Usrs.Me.UsrDat.UsrCod == UsrDat->UsrCod) // Skip me
return;
/***** Unfollow user in database *****/
DB_QueryDELETE ("can not unfollow user",
"DELETE FROM usr_follow"
" WHERE FollowerCod=%ld AND FollowedCod=%ld",
Gbl.Usrs.Me.UsrDat.UsrCod,
UsrDat->UsrCod);
/***** Flush cache *****/
Fol_FlushCacheFollow ();
}
/*****************************************************************************/ /*****************************************************************************/
/****** Get and show ranking of users attending to number of followers *******/ /****** Get and show ranking of users attending to number of followers *******/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -64,6 +64,13 @@ void Fol_FollowUsr2 (void);
void Fol_UnfollowUsr1 (void); void Fol_UnfollowUsr1 (void);
void Fol_UnfollowUsr2 (void); void Fol_UnfollowUsr2 (void);
void Fol_RequestFollowStds (void);
void Fol_RequestFollowTchs (void);
void Fol_RequestUnfollowStds (void);
void Fol_RequestUnfollowTchs (void);
void Fol_FollowUsrs (void);
void Fol_UnfollowUsrs (void);
void Fol_GetAndShowRankingFollowers (void); void Fol_GetAndShowRankingFollowers (void);
void Fol_GetNotifFollower (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], void Fol_GetNotifFollower (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],

View File

@ -9129,6 +9129,90 @@ const char *Txt_Do_you_think_you_are_this_user =
"Voc&ecirc; acha que voc&ecirc; &eacute; deste usu&aacute;rio?"; "Voc&ecirc; acha que voc&ecirc; &eacute; deste usu&aacute;rio?";
#endif #endif
const char *Txt_Do_you_want_to_follow_the_selected_user_whom_you_do_not_follow_yet =
#if L==1 // ca
"Voleu seguir a l'usuari seleccionat a qui encara no segueix?";
#elif L==2 // de
"M&ouml;chten Sie dem ausgew&auml;hlten Benutzer folgen, dem Sie noch nicht folgen?";
#elif L==3 // en
"Do you want to follow the selected user whom you do not follow yet?";
#elif L==4 // es
"&iquest;Desea seguir al usuario seleccionado que a&uacute;n no sigue?";
#elif L==5 // fr
"Voulez-vous suivre l'utilisateur s&eacute;lectionn&eacute; que vous ne suivez pas encore?";
#elif L==6 // gn
"&iquest;Desea seguir al usuario seleccionado que a&uacute;n no sigue?"; // Okoteve traducción
#elif L==7 // it
"Vuoi seguire l'utente selezionato che non segui ancora?";
#elif L==8 // pl
"Czy chcesz &sacute;ledzi&cacute; wybranego u&zdot;ytkownika, kt&oacute;rego jeszcze nie &sacute;ledzisz?";
#elif L==9 // pt
"Voc&ecirc; quer seguir o usu&aacute;rio selecionado que voc&ecirc; n&atilde;o segue ainda?";
#endif
const char *Txt_Do_you_want_to_follow_the_X_selected_users_whom_you_do_not_follow_yet = // Warning: it is very important to include %u in the following sentences
#if L==1 // ca
"Voleu seguir als %u usuaris seleccionats als que encara no segueix?";
#elif L==2 // de
"M&ouml;chten Sie den %u ausgew&auml;hlten Benutzern folgen, denen Sie noch nicht folgen?";
#elif L==3 // en
"Do you want to follow the %u selected users whom you do not follow yet?";
#elif L==4 // es
"&iquest;Desea seguir a los %u usuarios seleccionados que a&uacute;n no sigue?";
#elif L==5 // fr
"Voulez-vous suivre les %u utilisateurs s&eacute;lectionn&eacute;s que vous ne suivez pas encore?";
#elif L==6 // gn
"&iquest;Desea seguir a los %u usuarios seleccionados que a&uacute;n no sigue?"; // Okoteve traducción
#elif L==7 // it
"Vuoi seguire i %u utenti selezionati che non segui ancora?";
#elif L==8 // pl
"Czy chcesz &sacute;ledzi&cacute; %u wybranych u&zdot;ytkownik&oacute;w, kt&oacute;rych jeszcze nie &sacute;ledzisz?";
#elif L==9 // pt
"Voc&ecirc; quer seguir os %u usu&aacute;rios selecionados que voc&ecirc; n&atilde;o segue ainda?";
#endif
const char *Txt_Do_you_want_to_stop_following_the_selected_user_whom_you_follow =
#if L==1 // ca
"Voleu deixar de seguir a l'usuari seleccionat a qui segueix?";
#elif L==2 // de
"M&ouml;chten Sie dem ausgew&auml;hlten Benutzer, dem Sie folgen, nicht mehr folgen?";
#elif L==3 // en
"Do you want to stop following the selected user whom you follow?";
#elif L==4 // es
"&iquest;Desea dejar de seguir al usuario seleccionado que sigue?";
#elif L==5 // fr
"Voulez-vous arr&ecirc;ter de suivre l'utilisateur s&eacute;lectionn&eacute; que vous suivez?";
#elif L==6 // gn
"&iquest;Desea dejar de seguir al usuario seleccionado que sigue?"; // Okoteve traducción
#elif L==7 // it
"Vuoi smettere di seguire l'utente selezionato che segui?";
#elif L==8 // pl
"Czy chcesz przesta&cacute; &sacute;ledzi&cacute; wybranego u&zdot;ytkownika, kt&oacute;rego &sacute;ledzisz?";
#elif L==9 // pt
"Voc&ecirc; quer parar de seguir o usu&aacute;rio selecionado que voc&ecirc; segue?";
#endif
const char *Txt_Do_you_want_to_stop_following_the_X_selected_users_whom_you_follow = // Warning: it is very important to include %u in the following sentences
#if L==1 // ca
"Voleu deixar de seguir als %u usuaris seleccionats als que segueix?";
#elif L==2 // de
"M&ouml;chten Sie nicht mehr den %u ausgew&auml;hlten Nutzern folgen, denen Sie folgen?";
#elif L==3 // en
"Do you want to stop following the %u selected users whom you follow?";
#elif L==4 // es
"&iquest;Desea dejar de seguir a los %u usuarios seleccionados que sigue?";
#elif L==5 // fr
"Voulez-vous arr&ecirc;ter de suivre les %u utilisateurs s&eacute;lectionn&eacute;s que vous suivez?";
#elif L==6 // gn
"&iquest;Desea dejar de seguir a los %u usuarios seleccionados que sigue?"; // Okoteve traducción
#elif L==7 // it
"Vuoi smettere di seguire i %u utenti selezionati che segui?";
#elif L==8 // pl
"Czy chcesz przesta&cacute; &sacute;ledzi&cacute; %u wybranych u&zdot;ytkownik&oacute;w, kt&oacute;rych &sacute;ledzisz?";
#elif L==9 // pt
"Voc&ecirc; quer parar de seguir os %u usu&aacute;rios selecionados que voc&ecirc; segue?";
#endif
const char *Txt_Document = const char *Txt_Document =
#if L==1 // ca #if L==1 // ca
"Document"; "Document";
@ -37643,6 +37727,45 @@ const char *Txt_Select_the_groups_in_from_which_you_want_to_register_remove_user
" ou ser&atilde;o removidos da disciplina e de todos os grupos."; " ou ser&atilde;o removidos da disciplina e de todos os grupos.";
#endif #endif
const char *Txt_Select_users_X_Followed_Y_Not_followed_Z = // Warning: it is very important to include three %u in the following sentences
#if L==1 // ca
"Usuaris seleccionats: %u<br />"
"&bull; Seguits: %u<br />"
"&bull; No seguits: %u";
#elif L==2 // de
"Ausgew&auml;hlte Benutzer: %u<br />"
"&bull; Gefolgt: %u<br />"
"&bull; Nicht gefolgt: %u";
#elif L==3 // en
"Selected users: %u<br />"
"&bull; Followed: %u<br />"
"&bull; Not followed: %u";
#elif L==4 // es
"Usuarios seleccionados: %u<br />"
"&bull; Seguidos: %u<br />"
"&bull; No seguidos: %u";
#elif L==5 // fr
"Utilisateurs s&eacute;lectionn&eacute;s: %u<br />"
"&bull; Suivis: %u<br />"
"&bull; Non suivis: %u";
#elif L==6 // gn
"Usuarios seleccionados: %u<br />"
"&bull; Seguidos: %u<br />"
"&bull; No seguidos: %u"; // Okoteve traducción
#elif L==7 // it
"Utenti selezionati: %u<br />"
"&bull; Seguiti: %u<br />"
"&bull; Non seguiti: %u";
#elif L==8 // pl
"Wybrani u&zdot;ytkownicy: %u<br />"
"&bull; Nast&eogon;pnie: %u<br />"
"&bull; Nie przestrzegano: %u";
#elif L==9 // pt
"Usu&aacute;rios selecionados: %u<br />"
"&bull; Seguidos: %u<br />"
"&bull; N&atilde;o seguidos: %u";
#endif
const char *Txt_Send = const char *Txt_Send =
#if L==1 // ca #if L==1 // ca
"Enviar"; "Enviar";
@ -54679,6 +54802,48 @@ const char *Txt_You_have_eliminated_the_confirmation_that_you_have_read_this_inf
" de que leu esta informa&ccedil;&atilde;o."; " de que leu esta informa&ccedil;&atilde;o.";
#endif #endif
const char *Txt_You_have_followed_one_user =
#if L==1 // ca
"Ha seguit a un usuari.";
#elif L==2 // de
"Sie haben einen Benutzer verfolgt.";
#elif L==3 // en
"You have followed one user.";
#elif L==4 // es
"Ha seguido a un usuario.";
#elif L==5 // fr
"Vous avez suivi un utilisateur.";
#elif L==6 // gn
"Ha seguido a un usuario."; // Okoteve traducción
#elif L==7 // it
"Hai seguito un utente.";
#elif L==8 // pl
"&Sacute;ledzi&lstrok;e&sacute; jednego u&zdot;ytkownika.";
#elif L==9 // pt
"Voc&ecirc; seguiu um usu&aacute;rio.";
#endif
const char *Txt_You_have_followed_X_users = // Warning: it is very important to include %u in the following sentences
#if L==1 // ca
"Ha seguit a %u usuaris.";
#elif L==2 // de
"Sie haben %u Benutzer verfolgt.";
#elif L==3 // en
"You have followed %u users.";
#elif L==4 // es
"Ha seguido a %u usuarios.";
#elif L==5 // fr
"Vous avez suivi %u utilisateurs.";
#elif L==6 // gn
"Ha seguido a %u usuarios."; // Okoteve traducción
#elif L==7 // it
"Hai seguito %u utenti.";
#elif L==8 // pl
"&Sacute;ledzi&lstrok;e&sacute; %u u&zdot;ytkownik&oacute;w.";
#elif L==9 // pt
"Voc&ecirc; seguiu %u usu&aacute;rios.";
#endif
const char *Txt_You_have_no_notifications = const char *Txt_You_have_no_notifications =
#if L==1 // ca #if L==1 // ca
"No tens notificacions."; "No tens notificacions.";
@ -54805,6 +54970,48 @@ const char *Txt_You_have_not_written_twice_the_same_new_password =
"Voc&ecirc; n&atilde;o escreveu duas vezes a mesma nova senha."; "Voc&ecirc; n&atilde;o escreveu duas vezes a mesma nova senha.";
#endif #endif
const char *Txt_You_have_stopped_following_one_user =
#if L==1 // ca
"Ha deixat de seguir a un usuari.";
#elif L==2 // de
"Sie haben aufgeh&ouml;rt, einem Benutzer zu folgen.";
#elif L==3 // en
"You have stopped following one user.";
#elif L==4 // es
"Ha dejado de seguir a un usuario.";
#elif L==5 // fr
"Vous avez arr&ecirc;t&eacute; de suivre un utilisateur.";
#elif L==6 // gn
"Ha dejado de seguir a un usuario."; // Okoteve traducción
#elif L==7 // it
"Hai smesso di seguire un utente.";
#elif L==8 // pl
"Przesta&lstrok;e&sacute; obserwowa&cacute; u&zdot;ytkownika.";
#elif L==9 // pt
"Voc&ecirc; parou de seguir um usu&aacute;rio.";
#endif
const char *Txt_You_have_stopped_following_X_users = // Warning: it is very important to include %u in the following sentences
#if L==1 // ca
"Ha deixat de seguir a %u usuaris.";
#elif L==2 // de
"Sie haben aufgeh&ouml;rt, %u Benutzern zu folgen.";
#elif L==3 // en
"You have stopped following %u users.";
#elif L==4 // es
"Ha seguido a %u usuarios.";
#elif L==5 // fr
"Vous avez cess&eacute; de suivre %u utilisateurs.";
#elif L==6 // gn
"Ha seguido a %u usuarios."; // Okoteve traducción
#elif L==7 // it
"Hai smesso di seguire %u utenti.";
#elif L==8 // pl
"Zatrzyma&lstrok;e&sacute; &sacute;ledzenie %u u&zdot;ytkownik&oacute;w.";
#elif L==9 // pt
"Voc&ecirc; parou de seguir %u usu&aacute;rios.";
#endif
const char *Txt_You_have_to_register_compulsorily_at_least_in_one_group_of_type_X = // Warning: it is very important to include %s in the following sentences const char *Txt_You_have_to_register_compulsorily_at_least_in_one_group_of_type_X = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca #if L==1 // ca
"Tiene que apuntarse obligatoriamente al menos a un grupo de tipo %s."; // Necessita traduccio "Tiene que apuntarse obligatoriamente al menos a un grupo de tipo %s."; // Necessita traduccio

View File

@ -242,6 +242,7 @@ static void Usr_PutActionShowHomework (void);
static void Usr_PutActionShowAttendance (void); static void Usr_PutActionShowAttendance (void);
static void Usr_PutActionNewMessage (void); static void Usr_PutActionNewMessage (void);
static void Usr_PutActionFollowUsers (void); static void Usr_PutActionFollowUsers (void);
static void Usr_PutActionUnfollowUsers (void);
static void Usr_StartListUsrsAction (Usr_ListUsrsAction_t ListUsrsAction); static void Usr_StartListUsrsAction (Usr_ListUsrsAction_t ListUsrsAction);
static void Usr_EndListUsrsAction (void); static void Usr_EndListUsrsAction (void);
static Usr_ListUsrsAction_t Usr_ListUsrsAction (Usr_ListUsrsAction_t DefaultAction); static Usr_ListUsrsAction_t Usr_ListUsrsAction (Usr_ListUsrsAction_t DefaultAction);
@ -8027,6 +8028,7 @@ static bool Usr_PutActionsSeveralUsrs (Rol_Role_t UsrsRole)
bool ICanViewAttendance; bool ICanViewAttendance;
bool ICanSendMessage; bool ICanSendMessage;
bool ICanFollow; bool ICanFollow;
bool ICanUnfollow;
bool OptionsShown = false; bool OptionsShown = false;
/***** Get the action to do *****/ /***** Get the action to do *****/
@ -8040,7 +8042,8 @@ static bool Usr_PutActionsSeveralUsrs (Rol_Role_t UsrsRole)
ICanViewHomework = ICanViewHomework =
ICanViewAttendance = ICanViewAttendance =
ICanSendMessage = ICanSendMessage =
ICanFollow = false; ICanFollow =
ICanUnfollow = false;
break; break;
case Rol_STD: case Rol_STD:
ICanViewRecords = ICanViewRecords =
@ -8053,6 +8056,7 @@ static bool Usr_PutActionsSeveralUsrs (Rol_Role_t UsrsRole)
ICanViewAttendance = (Gbl.Usrs.Me.Role.Logged == Rol_NET || ICanViewAttendance = (Gbl.Usrs.Me.Role.Logged == Rol_NET ||
Gbl.Usrs.Me.Role.Logged == Rol_TCH || Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);
ICanUnfollow = true;
break; break;
case Rol_TCH: case Rol_TCH:
ICanViewRecords = ICanViewRecords =
@ -8064,13 +8068,15 @@ static bool Usr_PutActionsSeveralUsrs (Rol_Role_t UsrsRole)
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);
ICanViewAttendance = false; ICanViewAttendance = false;
ICanUnfollow = true;
break; break;
default: default:
ICanViewRecords = ICanViewRecords =
ICanViewHomework = ICanViewHomework =
ICanViewAttendance = ICanViewAttendance =
ICanSendMessage = ICanSendMessage =
ICanFollow = false; ICanFollow =
ICanUnfollow = false;
break; break;
} }
@ -8113,6 +8119,13 @@ static bool Usr_PutActionsSeveralUsrs (Rol_Role_t UsrsRole)
OptionsShown = true; OptionsShown = true;
} }
/***** Unfollow *****/
if (ICanUnfollow)
{ // I can unfollow users
Usr_PutActionUnfollowUsers ();
OptionsShown = true;
}
/***** End list of options *****/ /***** End list of options *****/
fprintf (Gbl.F.Out,"</ul>"); fprintf (Gbl.F.Out,"</ul>");
@ -8184,6 +8197,19 @@ static void Usr_PutActionFollowUsers (void)
Usr_EndListUsrsAction (); Usr_EndListUsrsAction ();
} }
/*****************************************************************************/
/*********************** Put action to follow users **************************/
/*****************************************************************************/
static void Usr_PutActionUnfollowUsers (void)
{
extern const char *Txt_Unfollow;
Usr_StartListUsrsAction (Usr_UNFOLLOW_USERS);
fprintf (Gbl.F.Out,"%s",Txt_Unfollow);
Usr_EndListUsrsAction ();
}
/*****************************************************************************/ /*****************************************************************************/
/************ Put start/end of action to register/remove one user ************/ /************ Put start/end of action to register/remove one user ************/
/*****************************************************************************/ /*****************************************************************************/
@ -8231,7 +8257,9 @@ void Usr_DoActionOnSeveralUsrs1 (void)
/* Get the action to do */ /* Get the action to do */
Gbl.Usrs.Selected.Action = Usr_ListUsrsAction (Usr_LIST_USRS_UNKNOWN_ACTION); Gbl.Usrs.Selected.Action = Usr_ListUsrsAction (Usr_LIST_USRS_UNKNOWN_ACTION);
/***** Do actions *****/ /***** Change action depending on my selection *****/
Gbl.Action.Original = Gbl.Action.Act;
switch (Gbl.Usrs.Selected.Action) switch (Gbl.Usrs.Selected.Action)
{ {
case Usr_SHOW_RECORDS: case Usr_SHOW_RECORDS:
@ -8239,19 +8267,15 @@ void Usr_DoActionOnSeveralUsrs1 (void)
{ {
case ActDoActOnSevGst: case ActDoActOnSevGst:
Gbl.Action.Act = ActSeeRecSevGst; Gbl.Action.Act = ActSeeRecSevGst;
Tab_SetCurrentTab ();
break; break;
case ActDoActOnSevStd: case ActDoActOnSevStd:
Gbl.Action.Act = ActSeeRecSevStd; Gbl.Action.Act = ActSeeRecSevStd;
Tab_SetCurrentTab ();
break; break;
case ActDoActOnSevTch: case ActDoActOnSevTch:
Gbl.Action.Act = ActSeeRecSevTch; Gbl.Action.Act = ActSeeRecSevTch;
Tab_SetCurrentTab ();
break; break;
default: default:
Ale_CreateAlert (Ale_ERROR,NULL, Ale_CreateAlert (Ale_ERROR,NULL,"Wrong action.");
"Wrong action.");
break; break;
} }
break; break;
@ -8261,11 +8285,9 @@ void Usr_DoActionOnSeveralUsrs1 (void)
case ActDoActOnSevStd: case ActDoActOnSevStd:
case ActDoActOnSevTch: case ActDoActOnSevTch:
Gbl.Action.Act = ActAdmAsgWrkCrs; Gbl.Action.Act = ActAdmAsgWrkCrs;
Tab_SetCurrentTab ();
break; break;
default: default:
Ale_CreateAlert (Ale_ERROR,NULL, Ale_CreateAlert (Ale_ERROR,NULL,"Wrong action.");
"Wrong action.");
break; break;
} }
break; break;
@ -8274,11 +8296,9 @@ void Usr_DoActionOnSeveralUsrs1 (void)
{ {
case ActDoActOnSevStd: case ActDoActOnSevStd:
Gbl.Action.Act = ActSeeLstStdAtt; Gbl.Action.Act = ActSeeLstStdAtt;
Tab_SetCurrentTab ();
break; break;
default: default:
Ale_CreateAlert (Ale_ERROR,NULL, Ale_CreateAlert (Ale_ERROR,NULL,"Wrong action.");
"Wrong action.");
break; break;
} }
break; break;
@ -8288,23 +8308,47 @@ void Usr_DoActionOnSeveralUsrs1 (void)
case ActDoActOnSevStd: case ActDoActOnSevStd:
case ActDoActOnSevTch: case ActDoActOnSevTch:
Gbl.Action.Act = ActReqMsgUsr; Gbl.Action.Act = ActReqMsgUsr;
Tab_SetCurrentTab ();
break; break;
default: default:
Ale_CreateAlert (Ale_ERROR,NULL, Ale_CreateAlert (Ale_ERROR,NULL,"Wrong action.");
"Wrong action.");
break; break;
} }
break; break;
case Usr_FOLLOW_USERS: case Usr_FOLLOW_USERS:
Ale_CreateAlert (Ale_WARNING,NULL, switch (Gbl.Action.Act)
"Not implemented."); {
case ActDoActOnSevStd:
Gbl.Action.Act = ActReqFolSevStd;
break;
case ActDoActOnSevTch:
Gbl.Action.Act = ActReqFolSevTch;
break;
default:
Ale_CreateAlert (Ale_ERROR,NULL,"Wrong action.");
break;
}
break;
case Usr_UNFOLLOW_USERS:
switch (Gbl.Action.Act)
{
case ActDoActOnSevStd:
Gbl.Action.Act = ActReqUnfSevStd;
break;
case ActDoActOnSevTch:
Gbl.Action.Act = ActReqUnfSevTch;
break;
default:
Ale_CreateAlert (Ale_ERROR,NULL,"Wrong action.");
break;
}
break; break;
default: default:
Ale_CreateAlert (Ale_ERROR,NULL, Ale_CreateAlert (Ale_ERROR,NULL,"Wrong action.");
"Wrong action.");
break; break;
} }
if (Gbl.Action.Act != Gbl.Action.Original) // Action has changed
Tab_SetCurrentTab ();
} }
void Usr_DoActionOnSeveralUsrs2 (void) void Usr_DoActionOnSeveralUsrs2 (void)

View File

@ -115,7 +115,7 @@ typedef enum
} Usr_ShowUsrsType_t; } Usr_ShowUsrsType_t;
#define Usr_SHOW_USRS_TYPE_DEFAULT Usr_LIST_AS_CLASS_PHOTO #define Usr_SHOW_USRS_TYPE_DEFAULT Usr_LIST_AS_CLASS_PHOTO
#define Usr_LIST_USRS_NUM_ACTIONS 6 #define Usr_LIST_USRS_NUM_ACTIONS 7
typedef enum typedef enum
{ {
Usr_LIST_USRS_UNKNOWN_ACTION = 0, Usr_LIST_USRS_UNKNOWN_ACTION = 0,
@ -124,6 +124,7 @@ typedef enum
Usr_SHOW_ATTENDANCE = 3, Usr_SHOW_ATTENDANCE = 3,
Usr_NEW_MESSAGE = 4, Usr_NEW_MESSAGE = 4,
Usr_FOLLOW_USERS = 5, Usr_FOLLOW_USERS = 5,
Usr_UNFOLLOW_USERS = 6,
} Usr_ListUsrsAction_t; } Usr_ListUsrsAction_t;
#define Usr_LIST_USRS_DEFAULT_ACTION Usr_SHOW_RECORDS #define Usr_LIST_USRS_DEFAULT_ACTION Usr_SHOW_RECORDS