diff --git a/swad_changelog.h b/swad_changelog.h index 57ff4d146..a53ba6fe1 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -109,7 +109,6 @@ // TODO: By default, profile and photo should be visible by users who share course // TODO: When page is refreshed in course works, prevent users to be duplicated // TODO: Fix bug at the end of ranking (number too low) when a course is selected -// TODO: Reply to one user, suggested by Francisco Ocaña Lara // TODO: Reply to all // TODO: Reply icons should appear without text // TODO: Link to remove messages is too wide. For example: "Remove these X messages". @@ -118,12 +117,13 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 15.71.3 (2015-12-22)" +#define Log_PLATFORM_VERSION "SWAD 15.72 (2015-12-22)" #define CSS_FILE "swad15.65.1.css" // Number of lines (includes comments but not blank lines) has been got with the following command: // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1 /* + Version 15.72: Dec 22, 2015 Reply message only to sender, suggested by Francisco Ocaña Lara. Not finished. (187705 lines) Version 15.71.3: Dec 22, 2015 Changes in birthday range of years. (187669 lines) Version 15.71.2: Dec 21, 2015 Fixed bugs in removing old files in briefcase. (187666 lines) Version 15.71.1: Dec 21, 2015 Fixed bugs in removing old files in briefcase. (187665 lines) diff --git a/swad_global.h b/swad_global.h index 0b87a35ca..76dd13556 100644 --- a/swad_global.h +++ b/swad_global.h @@ -580,9 +580,13 @@ struct Globals char FilterFromTo[Usr_MAX_LENGTH_USR_NAME_OR_SURNAME*3+1]; // Show only messages from/to these users char FilterContent[Msg_MAX_LENGTH_FILTER_CONTENT+1]; // Show only messages that match this content bool ShowOnlyUnreadMsgs; // Show only unread messages (this option is applicable only for received messages) - bool IsReply; // Is the message I am editing a reply to a received message? - long RepliedMsgCod; // Original message code when I am editing a reply to a received message long ExpandedMsgCod; // The current expanded message code + struct + { + bool IsReply; // Is the message I am editing a reply? + bool ShowOtherRecipients; // Shown other recipients or only the sender of the original message? + long OriginalMsgCod; // Original message code when I am editing a reply + } Reply; char FileNameMail[PATH_MAX+1]; FILE *FileMail; } Msg; diff --git a/swad_message.c b/swad_message.c index aa0ab565e..953b4ccc3 100644 --- a/swad_message.c +++ b/swad_message.c @@ -80,6 +80,7 @@ static void Msg_ShowASentOrReceivedMessage (Msg_TypeOfMessages_t TypeOfMessages, static void Msg_GetStatusOfSentMsg (long MsgCod,bool *Expanded); static void Msg_GetStatusOfReceivedMsg (long MsgCod,bool *Open,bool *Replied,bool *Expanded); static long Msg_GetParamMsgCod (void); +static void Msg_WriteFormUsrsIDsOrNicksOtherRecipients (void); static void Msg_WriteFormSubjectAndContentMsgToUsrs (const char *Content); static void Msg_ShowNumMsgsDeleted (unsigned NumMsgs); @@ -259,6 +260,7 @@ void Msg_FormMsgUsrs (void) static void Msg_PutFormMsgUsrs (const char *Content) { extern const char *The_ClassForm[The_NUM_THEMES]; + extern const char *Txt_Reply_message; extern const char *Txt_New_message; extern const char *Txt_MSG_To; extern const char *Txt_Send_message; @@ -269,9 +271,17 @@ static void Msg_PutFormMsgUsrs (const char *Content) /***** Get parameter that indicates if the message is a reply to another message *****/ Par_GetParToText ("IsReply",YN,1); - if ((Gbl.Msg.IsReply = (Str_ConvertToUpperLetter (YN[0]) == 'Y'))) + if ((Gbl.Msg.Reply.IsReply = (Str_ConvertToUpperLetter (YN[0]) == 'Y'))) + { /* Get original message code */ - Gbl.Msg.RepliedMsgCod = Msg_GetParamMsgCod (); + Gbl.Msg.Reply.OriginalMsgCod = Msg_GetParamMsgCod (); + + /* Get who to show as potential recipients: + - the sender of the original message and other users + - only the sender of the original message (default) */ + Par_GetParToText ("ShowOtherRecipients",YN,1); + Gbl.Msg.Reply.ShowOtherRecipients = (Str_ConvertToUpperLetter (YN[0]) == 'Y'); + } /***** Get user's code of possible preselected recipient *****/ Usr_GetParamOtherUsrCodEncrypted (); @@ -305,7 +315,8 @@ static void Msg_PutFormMsgUsrs (const char *Content) Gbl.Usrs.LstStds.NumUsrs)) { /***** Start frame *****/ - Lay_StartRoundFrame (NULL,Txt_New_message); + Lay_StartRoundFrame (NULL,Gbl.Msg.Reply.IsReply ? Txt_Reply_message : + Txt_New_message); /***** Form to select type of list used for select several users *****/ if (Gbl.Usrs.LstTchs.NumUsrs || @@ -314,10 +325,11 @@ static void Msg_PutFormMsgUsrs (const char *Content) /***** Start form to select recipients and write the message *****/ Act_FormStart (ActRcvMsgUsr); - if (Gbl.Msg.IsReply) + if (Gbl.Msg.Reply.IsReply) { Par_PutHiddenParamChar ("IsReply",'Y'); - Msg_PutHiddenParamMsgCod (Gbl.Msg.RepliedMsgCod); + // Par_PutHiddenParamChar ("ShowOtherRecipients",'N'); + Msg_PutHiddenParamMsgCod (Gbl.Msg.Reply.OriginalMsgCod); Usr_PutParamOtherUsrCodEncrypted (); } @@ -338,7 +350,7 @@ static void Msg_PutFormMsgUsrs (const char *Content) Usr_ListUsersToSelect (Rol_STUDENT); /* Other users (nicknames) */ - Msg_WriteFormUsrsIDsOrNicksOtherRecipients (Gbl.Msg.IsReply); + Msg_WriteFormUsrsIDsOrNicksOtherRecipients (); /* End of table */ fprintf (Gbl.F.Out,"" @@ -384,7 +396,7 @@ static void Msg_PutFormMsgUsrs (const char *Content) /************** Nicknames of recipients of a message to users ****************/ /*****************************************************************************/ -void Msg_WriteFormUsrsIDsOrNicksOtherRecipients (bool IsReply) +static void Msg_WriteFormUsrsIDsOrNicksOtherRecipients (void) { extern const char *Txt_Other_recipients; extern const char *Txt_Recipients; @@ -415,9 +427,9 @@ void Msg_WriteFormUsrsIDsOrNicksOtherRecipients (bool IsReply) "" @@ -560,14 +572,14 @@ void Msg_RecMsgFromUsr (void) bool IsReply; bool RecipientHasBannedMe; bool Replied = false; - long RepliedMsgCod = -1; // Initialized to avoid warning + long OriginalMsgCod = -1L; // Initialized to avoid warning const char *Ptr; unsigned NumRecipients; unsigned NumRecipientsToBeNotifiedByEMail = 0; struct UsrData UsrDstData; int NumErrors = 0; char *ListUsrsDst; - long NewMsgCod = -1; // Initiliazed to avoid warning + long NewMsgCod = -1L; // Initiliazed to avoid warning bool MsgAlreadyInserted = false; bool CreateNotif; bool NotifyByEmail; @@ -586,7 +598,7 @@ void Msg_RecMsgFromUsr (void) Par_GetParToText ("IsReply",YN,1); if ((IsReply = (Str_ConvertToUpperLetter (YN[0]) == 'Y'))) /* Get original message code */ - RepliedMsgCod = Msg_GetParamMsgCod (); + OriginalMsgCod = Msg_GetParamMsgCod (); /* Get user's code of possible preselected recipient */ Usr_GetParamOtherUsrCodEncrypted (); @@ -667,7 +679,8 @@ void Msg_RecMsgFromUsr (void) } /***** If this recipient is the original sender of a message been replied, set Replied to true *****/ - Replied = (IsReply && UsrDstData.UsrCod == Gbl.Usrs.Other.UsrDat.UsrCod); + Replied = (IsReply && + UsrDstData.UsrCod == Gbl.Usrs.Other.UsrDat.UsrCod); /***** This received message must be notified by e-mail? *****/ CreateNotif = (UsrDstData.Prefs.NotifNtfEvents & (1 << Ntf_EVENT_MESSAGE)); @@ -718,7 +731,7 @@ void Msg_RecMsgFromUsr (void) /***** Update received message setting Replied field to true *****/ if (Replied) - Msg_SetReceivedMsgAsReplied (RepliedMsgCod); + Msg_SetReceivedMsgAsReplied (OriginalMsgCod); /***** Write final message *****/ if (NumRecipients) @@ -2994,9 +3007,9 @@ static void Msg_WriteFormToReply (long MsgCod,long CrsCod,const char *Subject, } Grp_PutParamAllGroups (); Par_PutHiddenParamChar ("IsReply",'Y'); + // Par_PutHiddenParamChar ("ShowOtherRecipients",'N'); Msg_PutHiddenParamMsgCod (MsgCod); Usr_PutParamUsrCodEncrypted (EncryptedUsrCod); - // Par_PutHiddenParamString ("UsrCodAll",EncryptedUsrCod); fprintf (Gbl.F.Out,"", Subject); diff --git a/swad_message.h b/swad_message.h index 23f3b273a..6076a7cd8 100644 --- a/swad_message.h +++ b/swad_message.h @@ -59,7 +59,6 @@ typedef enum void Msg_ListEMails (void); // Creates an e-mail message to students void Msg_FormMsgUsrs (void); -void Msg_WriteFormUsrsIDsOrNicksOtherRecipients (bool IsReply); void Msg_PutHiddenParamAnotherRecipient (const struct UsrData *UsrDat); void Msg_PutHiddenParamOtherRecipients (void); void Msg_RecMsgFromUsr (void); diff --git a/swad_text.c b/swad_text.c index 44d589c73..b92439735 100644 --- a/swad_text.c +++ b/swad_text.c @@ -22598,7 +22598,7 @@ const char *Txt_New_mail_domain = const char *Txt_New_message = #if L==1 - "Nuevo mensaje"; // Necessita traduccio + "Nou missatge"; #elif L==2 "Neue Nachricht"; #elif L==3 @@ -29497,7 +29497,7 @@ const char *Txt_Remove_USER_from_the_course_X = // Warning: it is very important const char *Txt_Reply = #if L==1 - "Responder"; // Necessita traduccio + "Respondre"; #elif L==2 "Antworten"; #elif L==3 @@ -29518,7 +29518,7 @@ const char *Txt_Reply = const char *Txt_Reply_again = #if L==1 - "Responder otra vez"; // Necessita traduccio + "Respondre de nou"; #elif L==2 "Antworten wieder"; #elif L==3 @@ -29537,6 +29537,27 @@ const char *Txt_Reply_again = "Responder novamente"; #endif +const char *Txt_Reply_message = // "Reply" as a noun, not as a verb +#if L==1 + "Missatge de resposta"; +#elif L==2 + "Antwortnachricht"; +#elif L==3 + "Reply message"; +#elif L==4 + "Mensaje de respuesta"; +#elif L==5 + "Message de réponse"; +#elif L==6 + "Mensaje de respuesta"; // Okoteve traducción +#elif L==7 + "Messaggio di risposta"; +#elif L==8 + "Wiadomość odpowiedz"; +#elif L==9 + "Mensagem de resposta"; +#endif + const char *Txt_Requester = #if L==1 "Sol·licitant"; @@ -29560,7 +29581,7 @@ const char *Txt_Requester = const char *Txt_Reset = #if L==1 - "Poner a cero"; // Necessita traduccio + "Posar a zero"; #elif L==2 "Reset"; #elif L==3 @@ -29581,7 +29602,7 @@ const char *Txt_Reset = const char *Txt_Reset_survey = #if L==1 - "Poner encuesta a cero"; // Necessita traduccio + "Posar enquesta a zero"; #elif L==2 "Reset Umfrage"; #elif L==3 @@ -29602,15 +29623,15 @@ const char *Txt_Reset_survey = const char *Txt_results_per_page = #if L==1 - "resultados por página"; // Necessita traduccio + "resultats per pàgina"; #elif L==2 - "results per page"; // Need Übersetzung + "Ergebnisse pro Seite"; #elif L==3 "results per page"; #elif L==4 "resultados por página"; #elif L==5 - "results per page"; // Besoin de traduction + "résultats par page"; #elif L==6 "resultados por página"; // Okoteve traducción #elif L==7 @@ -29618,7 +29639,7 @@ const char *Txt_results_per_page = #elif L==8 "wyników na stronie"; #elif L==9 - "results per page"; // Necessita de tradução + "resultados por página"; #endif const char *Txt_Results_tests = diff --git a/swad_user.c b/swad_user.c index 46ebd8260..7c774c9c1 100644 --- a/swad_user.c +++ b/swad_user.c @@ -5022,10 +5022,11 @@ void Usr_PutExtraParamsUsrList (Act_Action_t NextAction) case ActReqMsgUsr: Usr_PutHiddenParUsrCodAll (NextAction,Gbl.Usrs.Select.All); Msg_PutHiddenParamOtherRecipients (); - if (Gbl.Msg.IsReply) + if (Gbl.Msg.Reply.IsReply) { Par_PutHiddenParamChar ("IsReply",'Y'); - Msg_PutHiddenParamMsgCod (Gbl.Msg.RepliedMsgCod); + // Par_PutHiddenParamChar ("ShowOtherRecipients",'N'); + Msg_PutHiddenParamMsgCod (Gbl.Msg.Reply.OriginalMsgCod); Usr_PutParamOtherUsrCodEncrypted (); } break; diff --git a/swad_web_service.c b/swad_web_service.c index bd5c77bb2..8e55e715f 100644 --- a/swad_web_service.c +++ b/swad_web_service.c @@ -186,7 +186,7 @@ static void Svc_GetListGrpsInAttendanceEvent (long AttCod,char **ListGroups); static int Svc_GetMyLanguage (void); -static int Svc_sendMessageToUsr (long RepliedMsgCod,long SenderUsrCod,long ReplyUsrCod,long RecipientUsrCod,bool NotifyByEmail,const char *Subject,const char *Content); +static int Svc_sendMessageToUsr (long OriginalMsgCod,long SenderUsrCod,long ReplyUsrCod,long RecipientUsrCod,bool NotifyByEmail,const char *Subject,const char *Content); static int Svc_GetTstConfig (long CrsCod); static int Svc_GetNumTestQuestionsInCrs (long CrsCod); @@ -3007,7 +3007,7 @@ int swad__sendMessage (struct soap *soap, /************************* Send a message to one user ************************/ /*****************************************************************************/ -static int Svc_sendMessageToUsr (long RepliedMsgCod,long SenderUsrCod,long ReplyUsrCod,long RecipientUsrCod,bool NotifyByEmail,const char *Subject,const char *Content) +static int Svc_sendMessageToUsr (long OriginalMsgCod,long SenderUsrCod,long ReplyUsrCod,long RecipientUsrCod,bool NotifyByEmail,const char *Subject,const char *Content) { static bool MsgAlreadyInserted = false; static long NewMsgCod; @@ -3058,7 +3058,7 @@ static int Svc_sendMessageToUsr (long RepliedMsgCod,long SenderUsrCod,long Reply { /***** ...then update received message setting Replied field to true *****/ sprintf (Query,"UPDATE msg_rcv SET Replied='Y' WHERE MsgCod='%ld' AND UsrCod='%ld'", - RepliedMsgCod,SenderUsrCod); + OriginalMsgCod,SenderUsrCod); DB_QueryUPDATE (Query,"can not update a received message"); }