mirror of https://github.com/acanas/swad-core.git
Version18.111
This commit is contained in:
parent
073a2f779a
commit
79e5fbc4e1
|
@ -1311,9 +1311,10 @@ Messages:
|
|||
1103. ActReqMsgUsr Write message to several users
|
||||
1104. ActSeeRcvMsg Show the messages received from other users (link in menu)
|
||||
1105. ActSeeSntMsg Show the messages sent to other users
|
||||
1106. ActMaiStd Send an email to students
|
||||
1107. ActWriAnn Show form to create a new global announcement
|
||||
1108. ActRcvAnn Receive and create a new global announcement
|
||||
1106. ActReqMaiUsr Select users to send an email to them
|
||||
1107. ActMaiUsr Send an email to users
|
||||
1108. ActWriAnn Show form to create a new global announcement
|
||||
1109. ActRcvAnn Receive and create a new global announcement
|
||||
1110. ActHidAnn Hide a global announcement that was active
|
||||
1111. ActRevAnn Reveal a global announcement that was hidden
|
||||
1112. ActRemAnn Remove global announcement
|
||||
|
@ -2881,7 +2882,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
|
|||
/* ActReqMsgUsr */{ 26, 4,TabMsg,ActReqMsgUsr ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Msg_FormMsgUsrs ,"marker" },
|
||||
/* ActSeeRcvMsg */{ 3, 5,TabMsg,ActSeeRcvMsg ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Msg_ShowRecMsgs ,"inbox" },
|
||||
/* ActSeeSntMsg */{ 70, 6,TabMsg,ActSeeSntMsg ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Msg_ShowSntMsgs ,"share" },
|
||||
/* ActMaiStd */{ 100, 7,TabMsg,ActMaiStd ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_ListEmails ,"envelope" },
|
||||
/* ActReqMaiUsr */{1772, 7,TabMsg,ActReqMaiUsr ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_ReqUsrsToListEmails ,"envelope" },
|
||||
|
||||
// Actions not in menu:
|
||||
/* ActWriAnn */{1237,-1,TabUnk,ActSeeAnn ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Ann_ShowFormAnnouncement ,NULL},
|
||||
|
@ -3062,6 +3063,8 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
|
|||
/* ActUnbUsrMsg */{1016,-1,TabUnk,ActSeeRcvMsg ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Msg_UnbanSenderWhenShowingMsgs ,NULL},
|
||||
/* ActUnbUsrLst */{1018,-1,TabUnk,ActSeeRcvMsg ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Msg_UnbanSenderWhenListingUsrs ,NULL},
|
||||
|
||||
/* ActMaiUsr */{ 100,-1,TabUnk,ActReqMaiUsr ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_GetSelectedUsrsAndListEmails,NULL},
|
||||
|
||||
// TabAna ******************************************************************
|
||||
// Actions in menu:
|
||||
/* ActReqUseGbl */{ 761, 0,TabAna,ActReqUseGbl ,0x3F8,0x3C7,0x3C7,0x3C7,0x3C7,0x3C7,0x3C7,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Fig_ReqShowFigures ,"chart-pie" },
|
||||
|
@ -3273,7 +3276,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
|
|||
-1, // #97 (obsolete action)
|
||||
ActAssTst, // #98
|
||||
-1, // #99 (obsolete action)
|
||||
ActMaiStd, // #100
|
||||
ActMaiUsr, // #100
|
||||
-1, // #101 (obsolete action)
|
||||
-1, // #102 (obsolete action)
|
||||
ActReqTst, // #103
|
||||
|
@ -4945,6 +4948,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
|
|||
ActAllShaSocNotUsr, // #1769
|
||||
ActAllFavSocNotUsr, // #1770
|
||||
ActAllFavSocComUsr, // #1771
|
||||
ActReqMaiUsr, // #1772
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -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
|
||||
|
||||
#define Act_NUM_ACTIONS (1 + 8 + 61 + 38 + 12 + 42 + 36 + 19 + 110 + 157 + 437 + 176 + 168 + 15 + 67)
|
||||
#define Act_NUM_ACTIONS (1 + 8 + 61 + 38 + 12 + 42 + 36 + 19 + 110 + 157 + 437 + 176 + 169 + 15 + 67)
|
||||
|
||||
#define Act_MAX_ACTION_COD 1771
|
||||
#define Act_MAX_ACTION_COD 1772
|
||||
|
||||
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13
|
||||
|
||||
|
@ -1336,7 +1336,7 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
|
|||
#define ActReqMsgUsr (ActUnfSevTch + 5)
|
||||
#define ActSeeRcvMsg (ActUnfSevTch + 6)
|
||||
#define ActSeeSntMsg (ActUnfSevTch + 7)
|
||||
#define ActMaiStd (ActUnfSevTch + 8)
|
||||
#define ActReqMaiUsr (ActUnfSevTch + 8)
|
||||
// Secondary actions
|
||||
#define ActWriAnn (ActUnfSevTch + 9)
|
||||
#define ActRcvAnn (ActUnfSevTch + 10)
|
||||
|
@ -1502,29 +1502,31 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
|
|||
#define ActUnbUsrMsg (ActUnfSevTch + 167)
|
||||
#define ActUnbUsrLst (ActUnfSevTch + 168)
|
||||
|
||||
#define ActMaiUsr (ActUnfSevTch + 169)
|
||||
|
||||
/*****************************************************************************/
|
||||
/****************************** Statistics tab *******************************/
|
||||
/*****************************************************************************/
|
||||
// Actions in menu
|
||||
#define ActReqUseGbl (ActUnbUsrLst + 1)
|
||||
#define ActSeePhoDeg (ActUnbUsrLst + 2)
|
||||
#define ActReqStaCrs (ActUnbUsrLst + 3)
|
||||
#define ActReqAccGbl (ActUnbUsrLst + 4)
|
||||
#define ActReqMyUsgRep (ActUnbUsrLst + 5)
|
||||
#define ActMFUAct (ActUnbUsrLst + 6)
|
||||
#define ActReqUseGbl (ActMaiUsr + 1)
|
||||
#define ActSeePhoDeg (ActMaiUsr + 2)
|
||||
#define ActReqStaCrs (ActMaiUsr + 3)
|
||||
#define ActReqAccGbl (ActMaiUsr + 4)
|
||||
#define ActReqMyUsgRep (ActMaiUsr + 5)
|
||||
#define ActMFUAct (ActMaiUsr + 6)
|
||||
|
||||
// Secondary actions
|
||||
#define ActSeeUseGbl (ActUnbUsrLst + 7)
|
||||
#define ActPrnPhoDeg (ActUnbUsrLst + 8)
|
||||
#define ActCalPhoDeg (ActUnbUsrLst + 9)
|
||||
#define ActSeeAccGbl (ActUnbUsrLst + 10)
|
||||
#define ActReqAccCrs (ActUnbUsrLst + 11)
|
||||
#define ActSeeAccCrs (ActUnbUsrLst + 12)
|
||||
#define ActSeeAllStaCrs (ActUnbUsrLst + 13)
|
||||
#define ActSeeUseGbl (ActMaiUsr + 7)
|
||||
#define ActPrnPhoDeg (ActMaiUsr + 8)
|
||||
#define ActCalPhoDeg (ActMaiUsr + 9)
|
||||
#define ActSeeAccGbl (ActMaiUsr + 10)
|
||||
#define ActReqAccCrs (ActMaiUsr + 11)
|
||||
#define ActSeeAccCrs (ActMaiUsr + 12)
|
||||
#define ActSeeAllStaCrs (ActMaiUsr + 13)
|
||||
|
||||
#define ActLstClk (ActUnbUsrLst + 14)
|
||||
#define ActLstClk (ActMaiUsr + 14)
|
||||
|
||||
#define ActSeeMyUsgRep (ActUnbUsrLst + 15)
|
||||
#define ActSeeMyUsgRep (ActMaiUsr + 15)
|
||||
|
||||
/*****************************************************************************/
|
||||
/******************************** Profile tab ********************************/
|
||||
|
|
|
@ -456,10 +456,14 @@ En OpenSWAD:
|
|||
ps2pdf source.ps destination.pdf
|
||||
*/
|
||||
|
||||
#define Log_PLATFORM_VERSION "SWAD 18.110.3 (2019-04-11)"
|
||||
#define Log_PLATFORM_VERSION "SWAD 18.111 (2019-04-11)"
|
||||
#define CSS_FILE "swad18.92.css"
|
||||
#define JS_FILE "swad18.92.js"
|
||||
/*
|
||||
Version 18.111: Apr 11, 2019 New option to select users to compose an email to them. (242541 lines)
|
||||
1 change necessary in database:
|
||||
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1772','es','N','Seleccionar usuarios para envío correo');
|
||||
|
||||
Version 18.110.3: Apr 11, 2019 Code refactoring in attendance events. (242526 lines)
|
||||
Version 18.110.2: Apr 11, 2019 A user can have several roles in the same project. (242527 lines)
|
||||
Version 18.110.1: Apr 11, 2019 Code refactoring in selection of groups and users. (242553 lines)
|
||||
|
|
|
@ -3187,9 +3187,6 @@ static void Brw_ShowFileBrowsersAsgWrkCrs (void)
|
|||
|
||||
/***** End table and box *****/
|
||||
Box_EndBoxTable ();
|
||||
|
||||
/***** Free memory used by list of selected users' codes *****/
|
||||
Usr_FreeListsSelectedUsrsCods ();
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
213
swad_mail.c
213
swad_mail.c
|
@ -88,6 +88,8 @@ static void Mai_PutFormToCreateMailDomain (void);
|
|||
static void Mai_PutHeadMailDomains (void);
|
||||
static void Mai_CreateMailDomain (struct Mail *Mai);
|
||||
|
||||
static void Mai_ListEmails (void);
|
||||
|
||||
static void Mai_ShowFormChangeUsrEmail (const struct UsrData *UsrDat,bool ItsMe,
|
||||
bool IMustFillInEmail,bool IShouldConfirmEmail);
|
||||
|
||||
|
@ -874,144 +876,141 @@ static void Mai_CreateMailDomain (struct Mail *Mai)
|
|||
Mai->Domain,Mai->Info);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/************** Request edition of works of users of the course **************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Mai_ReqUsrsToListEmails (void)
|
||||
{
|
||||
extern const char *Hlp_MESSAGES_Email;
|
||||
extern const char *Txt_View_email_addresses;
|
||||
|
||||
/***** List users to select some of them *****/
|
||||
Usr_PutFormToSelectUsrsToGoToAct (ActMaiUsr,NULL,
|
||||
Hlp_MESSAGES_Email,
|
||||
Txt_View_email_addresses);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/****** Get and check list of selected users, and show users' emails ********/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Mai_GetSelectedUsrsAndListEmails (void)
|
||||
{
|
||||
Usr_GetSelectedUsrsAndGoToAct (Mai_ListEmails, // when user(s) selected
|
||||
Mai_ReqUsrsToListEmails); // when no user selected
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/****** List the emails of all the students to creates an email message ******/
|
||||
/*****************************************************************************/
|
||||
|
||||
#define Mai_MAX_BYTES_STR_ADDR (256 * 1024 - 1)
|
||||
|
||||
void Mai_ListEmails (void)
|
||||
static void Mai_ListEmails (void)
|
||||
{
|
||||
extern const char *Hlp_MESSAGES_Email;
|
||||
extern const char *The_ClassFormOutBoxBold[The_NUM_THEMES];
|
||||
extern const char *Txt_Students_who_have_accepted_and_who_have_email;
|
||||
extern const char *Txt_X_students_who_have_email;
|
||||
extern const char *Txt_X_students_who_have_accepted_and_who_have_email;
|
||||
extern const char *Txt_Email_addresses;
|
||||
extern const char *Txt_X_users_who_have_email;
|
||||
extern const char *Txt_X_users_who_have_accepted_and_who_have_email;
|
||||
extern const char *Txt_Create_email_message;
|
||||
unsigned NumUsr;
|
||||
unsigned NumStdsWithEmail;
|
||||
unsigned NumAcceptedStdsWithEmail;
|
||||
unsigned NumUsrsWithEmail = 0;
|
||||
unsigned NumAcceptedUsrsWithEmail = 0;
|
||||
char StrAddresses[Mai_MAX_BYTES_STR_ADDR + 1]; // TODO: Use malloc depending on the number of students
|
||||
unsigned int LengthStrAddr = 0;
|
||||
struct UsrData UsrDat;
|
||||
|
||||
/***** Get groups to show ******/
|
||||
Grp_GetParCodsSeveralGrpsToShowUsrs ();
|
||||
|
||||
/***** Get and order list of students in this course *****/
|
||||
Usr_GetListUsrs (Hie_CRS,Rol_STD);
|
||||
const char *Ptr;
|
||||
|
||||
/***** Start the box used to list the emails *****/
|
||||
Box_StartBox (NULL,Txt_Students_who_have_accepted_and_who_have_email,NULL,
|
||||
Box_StartBox (NULL,Txt_Email_addresses,NULL,
|
||||
Hlp_MESSAGES_Email,Box_NOT_CLOSABLE);
|
||||
|
||||
/***** Form to select groups *****/
|
||||
Grp_ShowFormToSelectSeveralGroups (NULL,
|
||||
Grp_ONLY_MY_GROUPS);
|
||||
/***** Start list with users' email addresses *****/
|
||||
fprintf (Gbl.F.Out,"<div class=\"DAT_SMALL CENTER_MIDDLE\">");
|
||||
|
||||
/***** Start section with user list *****/
|
||||
Lay_StartSection (Usr_USER_LIST_SECTION_ID);
|
||||
/***** Initialize structure with user's data *****/
|
||||
Usr_UsrDataConstructor (&UsrDat);
|
||||
|
||||
if (Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs)
|
||||
/***** Get email addresses of the selected users *****/
|
||||
StrAddresses[0] = '\0';
|
||||
Ptr = Gbl.Usrs.Selected.List[Rol_UNK];
|
||||
while (*Ptr)
|
||||
{
|
||||
if (Usr_GetIfShowBigList (Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs,NULL,NULL))
|
||||
{
|
||||
/***** Initialize structure with user's data *****/
|
||||
Usr_UsrDataConstructor (&UsrDat);
|
||||
/* Get next user */
|
||||
Par_GetNextStrUntilSeparParamMult (&Ptr,UsrDat.EncryptedUsrCod,
|
||||
Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64);
|
||||
Usr_GetUsrCodFromEncryptedUsrCod (&UsrDat);
|
||||
|
||||
/***** List the students' email addresses *****/
|
||||
fprintf (Gbl.F.Out,"<div class=\"DAT_SMALL CENTER_MIDDLE\">");
|
||||
for (NumUsr = 0, NumStdsWithEmail = 0, NumAcceptedStdsWithEmail = 0,
|
||||
StrAddresses[0] = '\0';
|
||||
NumUsr < Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs;
|
||||
NumUsr++)
|
||||
{
|
||||
/* Copy user's basic data from list */
|
||||
Usr_CopyBasicUsrDataFromList (&UsrDat,&Gbl.Usrs.LstUsrs[Rol_STD].Lst[NumUsr]);
|
||||
/* Get user's email */
|
||||
Mai_GetEmailFromUsrCod (&UsrDat);
|
||||
|
||||
/* Get user's email */
|
||||
Mai_GetEmailFromUsrCod (&UsrDat);
|
||||
if (UsrDat.Email[0])
|
||||
{
|
||||
NumUsrsWithEmail++;
|
||||
|
||||
if (UsrDat.Email[0])
|
||||
/* Check if users has accepted inscription in current course */
|
||||
UsrDat.Accepted = Usr_CheckIfUsrHasAcceptedInCurrentCrs (&UsrDat);
|
||||
|
||||
if (UsrDat.Accepted) // If student has email and has accepted
|
||||
{
|
||||
if (NumAcceptedUsrsWithEmail > 0)
|
||||
{
|
||||
NumStdsWithEmail++;
|
||||
if (UsrDat.Accepted) // If student has email and has accepted
|
||||
{
|
||||
if (NumAcceptedStdsWithEmail > 0)
|
||||
{
|
||||
fprintf (Gbl.F.Out,", ");
|
||||
LengthStrAddr ++;
|
||||
if (LengthStrAddr > Mai_MAX_BYTES_STR_ADDR)
|
||||
Lay_ShowErrorAndExit ("The space allocated to store email addresses is full.");
|
||||
Str_Concat (StrAddresses,",",
|
||||
Mai_MAX_BYTES_STR_ADDR);
|
||||
}
|
||||
LengthStrAddr += strlen (UsrDat.Email);
|
||||
if (LengthStrAddr > Mai_MAX_BYTES_STR_ADDR)
|
||||
Lay_ShowErrorAndExit ("The space allocated to store email addresses is full.");
|
||||
Str_Concat (StrAddresses,UsrDat.Email,
|
||||
Mai_MAX_BYTES_STR_ADDR);
|
||||
fprintf (Gbl.F.Out,"<a href=\"mailto:%s?subject=%s\">%s</a>",
|
||||
UsrDat.Email,Gbl.Hierarchy.Crs.FullName,UsrDat.Email);
|
||||
|
||||
NumAcceptedStdsWithEmail++;
|
||||
}
|
||||
fprintf (Gbl.F.Out,", ");
|
||||
LengthStrAddr ++;
|
||||
if (LengthStrAddr > Mai_MAX_BYTES_STR_ADDR)
|
||||
Lay_ShowErrorAndExit ("The space allocated to store email addresses is full.");
|
||||
Str_Concat (StrAddresses,",",
|
||||
Mai_MAX_BYTES_STR_ADDR);
|
||||
}
|
||||
}
|
||||
fprintf (Gbl.F.Out,"</div>");
|
||||
LengthStrAddr += strlen (UsrDat.Email);
|
||||
if (LengthStrAddr > Mai_MAX_BYTES_STR_ADDR)
|
||||
Lay_ShowErrorAndExit ("The space allocated to store email addresses is full.");
|
||||
Str_Concat (StrAddresses,UsrDat.Email,
|
||||
Mai_MAX_BYTES_STR_ADDR);
|
||||
fprintf (Gbl.F.Out,"<a href=\"mailto:%s?subject=%s\">%s</a>",
|
||||
UsrDat.Email,Gbl.Hierarchy.Crs.FullName,UsrDat.Email);
|
||||
|
||||
/***** Free memory used for user's data *****/
|
||||
Usr_UsrDataDestructor (&UsrDat);
|
||||
|
||||
/***** Show a message with the number of students with email ****/
|
||||
fprintf (Gbl.F.Out,"<div class=\"DAT CENTER_MIDDLE\">");
|
||||
fprintf (Gbl.F.Out,Txt_X_students_who_have_email,
|
||||
NumStdsWithEmail,
|
||||
((float) NumStdsWithEmail /
|
||||
(float) Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs) * 100.0,
|
||||
Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs);
|
||||
fprintf (Gbl.F.Out,"</div>");
|
||||
|
||||
/***** Show a message with the number of students who have accepted and have email ****/
|
||||
fprintf (Gbl.F.Out,"<div class=\"DAT CENTER_MIDDLE\">");
|
||||
fprintf (Gbl.F.Out,Txt_X_students_who_have_accepted_and_who_have_email,
|
||||
NumAcceptedStdsWithEmail,
|
||||
((float) NumAcceptedStdsWithEmail /
|
||||
(float) Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs) * 100.0,
|
||||
Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs);
|
||||
fprintf (Gbl.F.Out,"</div>");
|
||||
|
||||
/***** Icon to open the client email program *****/
|
||||
fprintf (Gbl.F.Out,"<div class=\"CONTEXT_MENU\">"
|
||||
"<a href=\"mailto:%s?subject=%s&cc=%s&bcc=%s\""
|
||||
" title=\"%s\" class=\"%s\">",
|
||||
Gbl.Usrs.Me.UsrDat.Email,
|
||||
Gbl.Hierarchy.Crs.FullName,
|
||||
Gbl.Usrs.Me.UsrDat.Email,
|
||||
StrAddresses,
|
||||
Txt_Create_email_message,
|
||||
The_ClassFormOutBoxBold[Gbl.Prefs.Theme]);
|
||||
Ico_PutIconTextLink ("marker.svg",
|
||||
Txt_Create_email_message);
|
||||
fprintf (Gbl.F.Out,"</a>"
|
||||
"</div>");
|
||||
}
|
||||
NumAcceptedUsrsWithEmail++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else // Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs == 0
|
||||
/***** Show warning indicating no students found *****/
|
||||
Usr_ShowWarningNoUsersFound (Rol_STD);
|
||||
|
||||
/***** End section with user list *****/
|
||||
Lay_EndSection ();
|
||||
/***** Free memory used for user's data *****/
|
||||
Usr_UsrDataDestructor (&UsrDat);
|
||||
|
||||
/***** End list with users' email addresses *****/
|
||||
fprintf (Gbl.F.Out,"</div>");
|
||||
|
||||
/***** Show a message with the number of users with email ****/
|
||||
fprintf (Gbl.F.Out,"<div class=\"DAT CENTER_MIDDLE\">");
|
||||
fprintf (Gbl.F.Out,Txt_X_users_who_have_email,
|
||||
NumUsrsWithEmail);
|
||||
fprintf (Gbl.F.Out,"</div>");
|
||||
|
||||
/***** Show a message with the number of users who have accepted and have email ****/
|
||||
fprintf (Gbl.F.Out,"<div class=\"DAT CENTER_MIDDLE\">");
|
||||
fprintf (Gbl.F.Out,Txt_X_users_who_have_accepted_and_who_have_email,
|
||||
NumAcceptedUsrsWithEmail);
|
||||
fprintf (Gbl.F.Out,"</div>");
|
||||
|
||||
/***** Icon to open the client email program *****/
|
||||
fprintf (Gbl.F.Out,"<div class=\"CONTEXT_MENU\">"
|
||||
"<a href=\"mailto:%s?subject=%s&cc=%s&bcc=%s\""
|
||||
" title=\"%s\" class=\"%s\">",
|
||||
Gbl.Usrs.Me.UsrDat.Email,
|
||||
Gbl.Hierarchy.Crs.FullName,
|
||||
Gbl.Usrs.Me.UsrDat.Email,
|
||||
StrAddresses,
|
||||
Txt_Create_email_message,
|
||||
The_ClassFormOutBoxBold[Gbl.Prefs.Theme]);
|
||||
Ico_PutIconTextLink ("marker.svg",
|
||||
Txt_Create_email_message);
|
||||
fprintf (Gbl.F.Out,"</a>"
|
||||
"</div>");
|
||||
|
||||
/***** End the box used to list the emails *****/
|
||||
Box_EndBox ();
|
||||
|
||||
/***** Free memory for students list *****/
|
||||
Usr_FreeUsrsList (Rol_STD);
|
||||
|
||||
/***** Free memory for list of selected groups *****/
|
||||
Grp_FreeListCodSelectedGrps ();
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -72,7 +72,8 @@ void Mai_RenameMailDomainFull (void);
|
|||
void Mai_ContEditAfterChgMai (void);
|
||||
void Mai_RecFormNewMailDomain (void);
|
||||
|
||||
void Mai_ListEmails (void); // Creates an email message to students
|
||||
void Mai_ReqUsrsToListEmails (void);
|
||||
void Mai_GetSelectedUsrsAndListEmails (void);
|
||||
|
||||
bool Mai_CheckIfEmailIsValid (const char *Email);
|
||||
bool Mai_GetEmailFromUsrCod (struct UsrData *UsrDat);
|
||||
|
|
|
@ -255,7 +255,7 @@ const Act_Action_t Mnu_MenuActions[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB
|
|||
ActReqMsgUsr, // 4
|
||||
ActSeeRcvMsg, // 5
|
||||
ActSeeSntMsg, // 6
|
||||
ActMaiStd, // 7
|
||||
ActReqMaiUsr, // 7
|
||||
0, // 8
|
||||
0, // 9
|
||||
0, // 10
|
||||
|
|
|
@ -1999,9 +1999,6 @@ static void Prj_AddUsrsToProject (Prj_RoleInProject_t RoleInProject)
|
|||
}
|
||||
}
|
||||
|
||||
/***** Free memory used by list of selected users' codes *****/
|
||||
Usr_FreeListsSelectedUsrsCods ();
|
||||
|
||||
/***** Put form to edit project again *****/
|
||||
Prj_RequestCreatOrEditPrj (PrjCod);
|
||||
}
|
||||
|
|
184
swad_text.c
184
swad_text.c
|
@ -10232,6 +10232,27 @@ const char *Txt_Email =
|
|||
"Email";
|
||||
#endif
|
||||
|
||||
const char *Txt_Email_addresses =
|
||||
#if L==1 // ca
|
||||
"Adreces de correu";
|
||||
#elif L==2 // de
|
||||
"E-Mail-Adressen";
|
||||
#elif L==3 // en
|
||||
"Email addresses";
|
||||
#elif L==4 // es
|
||||
"Direcciones de correo";
|
||||
#elif L==5 // fr
|
||||
"Adresses e-mail";
|
||||
#elif L==6 // gn
|
||||
"Direcciones de correo"; // Okoteve traducción
|
||||
#elif L==7 // it
|
||||
"Indirizzi email";
|
||||
#elif L==8 // pl
|
||||
"Adresy e-mail";
|
||||
#elif L==9 // pt
|
||||
"Endereços de email";
|
||||
#endif
|
||||
|
||||
const char *Txt_Email_domain_X_removed = // Warning: it is very important to include %s in the following sentences
|
||||
#if L==1 // ca
|
||||
"Dominio de correo <strong>%s</strong> eliminado."; // Necessita traduccio
|
||||
|
@ -19508,7 +19529,7 @@ const char *Txt_MENU_TITLE[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB] =
|
|||
"Enviadas"
|
||||
#endif
|
||||
,
|
||||
// 7: ActMaiStd
|
||||
// 7: ActReqMaiUsr
|
||||
#if L==1 // ca
|
||||
"Correu"
|
||||
#elif L==2 // de
|
||||
|
@ -21362,10 +21383,10 @@ const char *Txt_MENU_SUBTITLE[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB] =
|
|||
"Mensagens enviadas por mim para outros usuários"
|
||||
#endif
|
||||
,
|
||||
// 7: ActMaiStd
|
||||
// 7: ActReqMaiUsr
|
||||
#if L==1 // ca
|
||||
"Creació d'un missatge de correu"
|
||||
" per enviar-lo a estudiants d'aquesta assignatura"
|
||||
" per enviar-lo a usuaris d'aquesta assignatura"
|
||||
" utilitzant el programa client de correu predeterminat en el meu sistema"
|
||||
#elif L==2 // de
|
||||
"E-Mail"
|
||||
|
@ -21373,13 +21394,13 @@ const char *Txt_MENU_SUBTITLE[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB] =
|
|||
"Email"
|
||||
#elif L==4 // es
|
||||
"Creación de un mensaje de correo"
|
||||
" para enviarlo a estudiantes de esta asignatura"
|
||||
" para enviarlo a usuarios de esta asignatura"
|
||||
" usando el programa cliente de correo predeterminado en mi sistema"
|
||||
#elif L==5 // fr
|
||||
"Courrier électronique"
|
||||
#elif L==6 // gn
|
||||
"Creación de un mensaje de correo"
|
||||
" para enviarlo a estudiantes de esta asignatura"
|
||||
" para enviarlo a esuarios de esta asignatura"
|
||||
" usando el programa cliente de correo predeterminado en mi sistema"// Okoteve traducción
|
||||
#elif L==7 // it
|
||||
"Email"
|
||||
|
@ -41196,87 +41217,6 @@ const char *Txt_Students_now_are_required_to_read_this_information =
|
|||
"Os estudantes agora precisam ler essas informações.";
|
||||
#endif
|
||||
|
||||
const char *Txt_X_students_who_have_email = // Warning: it is very important to include %u and %f in the following sentences
|
||||
#if L==1 // ca
|
||||
"%u estudiantes con correo (%.1f%% de %u estudiantes)"; // Necessita traduccio
|
||||
#elif L==2 // de
|
||||
"%u Studenten mit E-Mail (%.1f%% von %u Studenten)";
|
||||
#elif L==3 // en
|
||||
"%u students who have email (%.1f%% of %u students)";
|
||||
#elif L==4 // es
|
||||
"%u estudiantes con correo (%.1f%% de %u estudiantes)";
|
||||
#elif L==5 // fr
|
||||
"%u étudiants qui ont l'email (%.1f%% de %u étudiants)";
|
||||
#elif L==6 // gn
|
||||
"%u estudiantes con correo (%.1f%% de %u estudiantes)"; // Okoteve traducción
|
||||
#elif L==7 // it
|
||||
"%u studenti che hanno email (%.1f%% di %u studenti)";
|
||||
#elif L==8 // pl
|
||||
"%u students who have email (%.1f%% of %u students)"; // Potrzebujesz tlumaczenie
|
||||
#elif L==9 // pt
|
||||
"%u estudantes que têm email (%.1f%% dos %u estudantes)";
|
||||
#endif
|
||||
|
||||
const char *Txt_Students_who_have_accepted_and_who_have_email =
|
||||
#if L==1 // ca
|
||||
"Estudiantes que han aceptado la inscripción"
|
||||
" y que tienen correo"; // Necessita traduccio
|
||||
#elif L==2 // de
|
||||
"Studenten die akzeptiert wurden"
|
||||
" und die E-Mail";
|
||||
#elif L==3 // en
|
||||
"Students who have accepted"
|
||||
" and who have email";
|
||||
#elif L==4 // es
|
||||
"Estudiantes que han aceptado la inscripción"
|
||||
" y que tienen correo";
|
||||
#elif L==5 // fr
|
||||
"Étudiants qui ont accepté"
|
||||
" et qui ont l'email";
|
||||
#elif L==6 // gn
|
||||
"Estudiantes que han aceptado la inscripción"
|
||||
" y que tienen correo"; // Okoteve traducción
|
||||
#elif L==7 // it
|
||||
"Studenti che hanno aderito"
|
||||
" e che hanno email";
|
||||
#elif L==8 // pl
|
||||
"Students who have accepted"
|
||||
" and who have email"; // Potrzebujesz tlumaczenie
|
||||
#elif L==9 // pt
|
||||
"Estudantes que aceitaram"
|
||||
" e que têm email";
|
||||
#endif
|
||||
|
||||
const char *Txt_X_students_who_have_accepted_and_who_have_email = // Warning: it is very important to include %u and %f in the following sentences
|
||||
#if L==1 // ca
|
||||
"%u estudiantes que han aceptado la inscripción"
|
||||
" y que tienen correo (%.1f%% de %u estudiantes)"; // Necessita traduccio
|
||||
#elif L==2 // de
|
||||
"%u Studenten die akzeptiert wurden"
|
||||
" und die E-Mail (%.1f%% von %u Studenten)";
|
||||
#elif L==3 // en
|
||||
"%u students who have accepted"
|
||||
" and who have email (%.1f%% of %u students)";
|
||||
#elif L==4 // es
|
||||
"%u estudiantes que han aceptado la inscripción"
|
||||
" y que tienen correo (%.1f%% de %u estudiantes)";
|
||||
#elif L==5 // fr
|
||||
"%u étudiants qui ont accepté"
|
||||
" et qui ont l'email (%.1f%% de %u étudiants)";
|
||||
#elif L==6 // gn
|
||||
"%u estudiantes que han aceptado la inscripción"
|
||||
" y que tienen correo (%.1f%% de %u estudiantes)"; // Okoteve traducción
|
||||
#elif L==7 // it
|
||||
"%u studenti che hanno aderito"
|
||||
" e che hanno email (%.1f%% di %u studenti)";
|
||||
#elif L==8 // pl
|
||||
"%u students who have accepted"
|
||||
" and who have email (%.1f%% of %u students)"; // Potrzebujesz tlumaczenie
|
||||
#elif L==9 // pt
|
||||
"%u estudantes que aceitaram"
|
||||
" e que têm email (%.1f%% dos %u estudantes)";
|
||||
#endif
|
||||
|
||||
const char *Txt_Surname_1 =
|
||||
#if L==1 // ca
|
||||
"Primer cognom";
|
||||
|
@ -52155,6 +52095,57 @@ const char *Txt_users_with_no_group =
|
|||
"utilizadores com nenhum grupo";
|
||||
#endif
|
||||
|
||||
const char *Txt_X_users_who_have_accepted_and_who_have_email = // Warning: it is very important to include %u in the following sentences
|
||||
#if L==1 // ca
|
||||
"%u usuaris que han aceptado la inscripción"
|
||||
" y que tienen correo"; // Necessita traduccio
|
||||
#elif L==2 // de
|
||||
"%u Benutzer die akzeptiert wurden"
|
||||
" und die E-Mail";
|
||||
#elif L==3 // en
|
||||
"%u users who have accepted"
|
||||
" and who have email";
|
||||
#elif L==4 // es
|
||||
"%u usuarios que han aceptado la inscripción"
|
||||
" y que tienen correo";
|
||||
#elif L==5 // fr
|
||||
"%u utilisateurs qui ont accepté"
|
||||
" et qui ont l'email";
|
||||
#elif L==6 // gn
|
||||
"%u usuarios que han aceptado la inscripción"
|
||||
" y que tienen correo"; // Okoteve traducción
|
||||
#elif L==7 // it
|
||||
"%u utenti che hanno aderito"
|
||||
" e che hanno email";
|
||||
#elif L==8 // pl
|
||||
"%u użytkowników who have accepted"
|
||||
" and who have email"; // Potrzebujesz tlumaczenie
|
||||
#elif L==9 // pt
|
||||
"%u utilizadores que aceitaram"
|
||||
" e que têm email";
|
||||
#endif
|
||||
|
||||
const char *Txt_X_users_who_have_email = // Warning: it is very important to include %u in the following sentences
|
||||
#if L==1 // ca
|
||||
"%u usuaris con correo"; // Necessita traduccio
|
||||
#elif L==2 // de
|
||||
"%u Benutzer mit E-Mail";
|
||||
#elif L==3 // en
|
||||
"%u users who have email";
|
||||
#elif L==4 // es
|
||||
"%u usuarios con correo";
|
||||
#elif L==5 // fr
|
||||
"%u utilisateurs qui ont l'email";
|
||||
#elif L==6 // gn
|
||||
"%u usuarios con correo"; // Okoteve traducción
|
||||
#elif L==7 // it
|
||||
"%u utenti che hanno email";
|
||||
#elif L==8 // pl
|
||||
"%u użytkowników who have email"; // Potrzebujesz tlumaczenie
|
||||
#elif L==9 // pt
|
||||
"%u utilizadores que têm email";
|
||||
#endif
|
||||
|
||||
const char *Txt_USR_LIST_TYPES[Usr_NUM_USR_LIST_TYPES] =
|
||||
{
|
||||
"" // Usr_LIST_UNKNOWN
|
||||
|
@ -52326,6 +52317,27 @@ const char *Txt_View_data_of_FILE_OR_LINK_X = // Warning: it is very important t
|
|||
"Ver os dados de %s";
|
||||
#endif
|
||||
|
||||
const char *Txt_View_email_addresses =
|
||||
#if L==1 // ca
|
||||
"Veure adreces de correu";
|
||||
#elif L==2 // de
|
||||
"E-Mail-Adressen anzeigen";
|
||||
#elif L==3 // en
|
||||
"View email addresses";
|
||||
#elif L==4 // es
|
||||
"Ver direcciones de correo";
|
||||
#elif L==5 // fr
|
||||
"Voir les adresses email";
|
||||
#elif L==6 // gn
|
||||
"Ver asistencia"; // Okoteve traducción
|
||||
#elif L==7 // it
|
||||
"Vedi gli indirizzi email";
|
||||
#elif L==8 // pl
|
||||
"Zobacz adresy e-mail";
|
||||
#elif L==9 // pt
|
||||
"Ver endereços de email";
|
||||
#endif
|
||||
|
||||
const char *Txt_View_event =
|
||||
#if L==1 // ca
|
||||
"Veure esdeveniment";
|
||||
|
|
13
swad_user.c
13
swad_user.c
|
@ -6115,6 +6115,9 @@ void Usr_PutFormToSelectUsrsToGoToAct (Act_Action_t NextAction,void (*FuncParams
|
|||
/***** Get groups to show ******/
|
||||
Grp_GetParCodsSeveralGrpsToShowUsrs ();
|
||||
|
||||
/***** Get lists of the selected users if not already got *****/
|
||||
Usr_GetListsSelectedUsrsCods ();
|
||||
|
||||
/***** Get and order lists of users from this course *****/
|
||||
Usr_GetListUsrs (Hie_CRS,Rol_STD);
|
||||
Usr_GetListUsrs (Hie_CRS,Rol_NET);
|
||||
|
@ -8246,7 +8249,8 @@ static bool Usr_SetOptionsListUsrsAllowed (Rol_Role_t UsrsRole,
|
|||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
|
||||
|
||||
ICanChooseOption[Usr_OPTION_HOMEWORK] =
|
||||
ICanChooseOption[Usr_OPTION_ATTENDANCE] = (Gbl.Scope.Current == Hie_CRS &&
|
||||
ICanChooseOption[Usr_OPTION_ATTENDANCE] =
|
||||
ICanChooseOption[Usr_OPTION_EMAIL] = (Gbl.Scope.Current == Hie_CRS &&
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_NET ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
|
||||
|
@ -8254,6 +8258,7 @@ static bool Usr_SetOptionsListUsrsAllowed (Rol_Role_t UsrsRole,
|
|||
case Rol_TCH:
|
||||
ICanChooseOption[Usr_OPTION_RECORDS] =
|
||||
ICanChooseOption[Usr_OPTION_MESSAGE] =
|
||||
ICanChooseOption[Usr_OPTION_EMAIL] =
|
||||
ICanChooseOption[Usr_OPTION_FOLLOW] =
|
||||
ICanChooseOption[Usr_OPTION_UNFOLLOW] = (Gbl.Scope.Current == Hie_CRS &&
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_STD ||
|
||||
|
@ -8304,7 +8309,7 @@ static void Usr_PutOptionsListUsrs (const bool ICanChooseOption[Usr_LIST_USRS_NU
|
|||
Txt_View_homework, // Usr_OPTION_HOMEWORK
|
||||
Txt_View_attendance, // Usr_OPTION_ATTENDANCE
|
||||
Txt_Send_message, // Usr_OPTION_MESSAGE
|
||||
Txt_Create_email_message, // Usr_OPTION_EMAIL // TODO: Not activated. Active it when email to users allows selecting individual users
|
||||
Txt_Create_email_message, // Usr_OPTION_EMAIL
|
||||
Txt_Follow, // Usr_OPTION_FOLLOW
|
||||
Txt_Unfollow, // Usr_OPTION_UNFOLLOW
|
||||
};
|
||||
|
@ -8431,11 +8436,11 @@ void Usr_DoActionOnSeveralUsrs1 (void)
|
|||
break;
|
||||
}
|
||||
break;
|
||||
case Usr_OPTION_EMAIL: // TODO: Not activated. Active it when email to users allows selecting individual users
|
||||
case Usr_OPTION_EMAIL:
|
||||
switch (Gbl.Action.Act)
|
||||
{
|
||||
case ActDoActOnSevStd:
|
||||
Gbl.Action.Act = ActMaiStd;
|
||||
Gbl.Action.Act = ActMaiUsr;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -130,7 +130,7 @@ typedef enum
|
|||
Usr_OPTION_HOMEWORK = 2,
|
||||
Usr_OPTION_ATTENDANCE = 3,
|
||||
Usr_OPTION_MESSAGE = 4,
|
||||
Usr_OPTION_EMAIL = 5, // TODO: Not activated. Active it when email to users allows selecting individual users
|
||||
Usr_OPTION_EMAIL = 5,
|
||||
Usr_OPTION_FOLLOW = 6,
|
||||
Usr_OPTION_UNFOLLOW = 7,
|
||||
} Usr_ListUsrsOption_t;
|
||||
|
|
Loading…
Reference in New Issue