diff --git a/swad_agenda.c b/swad_agenda.c index f05d16a0e..28ee26bdc 100644 --- a/swad_agenda.c +++ b/swad_agenda.c @@ -55,10 +55,12 @@ extern struct Globals Gbl; /******************************* Private types *******************************/ /*****************************************************************************/ -#define Agd_NUM_AGENDA_TYPES 2 +#define Agd_NUM_AGENDA_TYPES 4 typedef enum { + Agd_USR_AGENDA_NOW, Agd_USR_AGENDA, + Agd_MY_AGENDA_NOW, Agd_MY_AGENDA, } Agd_AgendaType_t; @@ -71,6 +73,8 @@ typedef enum /*****************************************************************************/ static void Agd_ShowEvents (Agd_AgendaType_t AgendaType); +static void Agd_ShowEventsNow (Agd_AgendaType_t AgendaType); +static void Agd_WriteHeaderListEvents (Agd_AgendaType_t AgendaType); static void Agd_PutIconToViewEditMyAgenda (void); static void Agd_PutIconsListEvents (void); @@ -119,9 +123,12 @@ void Agd_PutParamAgd (void) void Agd_ShowUsrAgendaAfterLogIn (void) { + extern const char *Hlp_PROFILE_Agenda; extern const unsigned Txt_Current_CGI_SWAD_Language; + extern const char *Txt_Public_agenda_USER; extern const char *Txt_User_not_found_or_you_do_not_have_permission_; extern const char *Txt_Switching_to_LANGUAGE[1+Txt_NUM_LANGUAGES]; + bool ItsMe; if (Gbl.Usrs.Me.Logged) { @@ -130,8 +137,24 @@ void Agd_ShowUsrAgendaAfterLogIn (void) /***** Get user *****/ /* If nickname is correct, user code is already got from nickname */ if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat)) // Existing user + { + /***** Start frame *****/ + sprintf (Gbl.Title,Txt_Public_agenda_USER,Gbl.Usrs.Other.UsrDat.FullName); + ItsMe = (Gbl.Usrs.Me.UsrDat.UsrCod == Gbl.Usrs.Other.UsrDat.UsrCod); + Lay_StartRoundFrame ("100%",Gbl.Title, + ItsMe ? Agd_PutIconToViewEditMyAgenda : + NULL, + Hlp_PROFILE_Agenda); // TODO: Change + + /***** Show the current events in the user's agenda *****/ + Agd_ShowEventsNow (Agd_USR_AGENDA_NOW); + /***** Show all the visible events in the user's agenda *****/ Agd_ShowEvents (Agd_USR_AGENDA); + + /***** End frame *****/ + Lay_EndRoundFrame (); + } else Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); } @@ -148,12 +171,31 @@ void Agd_ShowUsrAgendaAfterLogIn (void) void Agd_ShowUsrAgenda (void) { + extern const char *Hlp_PROFILE_Agenda; + extern const char *Txt_Public_agenda_USER; extern const char *Txt_User_not_found_or_you_do_not_have_permission_; + bool ItsMe; /***** Get user *****/ if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ()) + { + /***** Start frame *****/ + sprintf (Gbl.Title,Txt_Public_agenda_USER,Gbl.Usrs.Other.UsrDat.FullName); + ItsMe = (Gbl.Usrs.Me.UsrDat.UsrCod == Gbl.Usrs.Other.UsrDat.UsrCod); + Lay_StartRoundFrame ("100%",Gbl.Title, + ItsMe ? Agd_PutIconToViewEditMyAgenda : + NULL, + Hlp_PROFILE_Agenda); // TODO: Change + + /***** Show the current events in the user's agenda *****/ + Agd_ShowEventsNow (Agd_USR_AGENDA_NOW); + /***** Show all the visible events in the user's agenda *****/ Agd_ShowEvents (Agd_USR_AGENDA); + + /***** End frame *****/ + Lay_EndRoundFrame (); + } else Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); } @@ -164,12 +206,45 @@ void Agd_ShowUsrAgenda (void) void Agd_ShowMyAgenda (void) { + extern const char *Hlp_PROFILE_Agenda; + extern const char *Txt_My_agenda; + extern const char *Txt_Public_agenda_USER; + /***** Get whether to show all events or only my events ******/ if (Gbl.Usrs.Me.AvailableRoles & (1 << Rol_TEACHER)) // I am a teacher in some courses Agd_GetParamWhichEvents (); + /***** Start frame *****/ + switch (Gbl.Agenda.WhichEvents) + { + case Agd_ALL_EVENTS: + Lay_StartRoundFrame ("100%",Txt_My_agenda, + Agd_PutIconsListEvents, + Hlp_PROFILE_Agenda); + break; + case Agd_ONLY_PUBLIC_EVENTS: + sprintf (Gbl.Title,Txt_Public_agenda_USER,Gbl.Usrs.Me.UsrDat.FullName); + Lay_StartRoundFrame ("100%",Gbl.Title, + Agd_PutIconsListEvents, + Hlp_PROFILE_Agenda); + break; + } + + /***** Put form to choice whether to show + all events or only public events *****/ + Act_FormStart (ActSeeMyAgd); + Agd_ShowFormToSelWhichEvents (ActSeeMyAgd); + Act_FormEnd (); + + /***** Show the current events in the user's agenda *****/ + if (Gbl.Agenda.WhichEvents == Agd_ONLY_PUBLIC_EVENTS) + Agd_ShowEventsNow (Agd_MY_AGENDA_NOW); + /***** Show all my events *****/ Agd_ShowEvents (Agd_MY_AGENDA); + + /***** End frame *****/ + Lay_EndRoundFrame (); } /*****************************************************************************/ @@ -181,19 +256,15 @@ static void Agd_ShowEvents (Agd_AgendaType_t AgendaType) extern const char *Hlp_PROFILE_Agenda; extern const char *Txt_Public_agenda_USER; extern const char *Txt_My_agenda; - extern const char *Txt_ASG_ATT_OR_SVY_HELP_ORDER[2]; - extern const char *Txt_ASG_ATT_OR_SVY_ORDER[2]; - extern const char *Txt_Event; - extern const char *Txt_Location; extern const char *Txt_No_events; - bool ItsMe; - Agd_Order_t Order; struct Pagination Pagination; unsigned NumEvent; Pag_WhatPaginate_t WhatPaginate[Agd_NUM_AGENDA_TYPES] = { - Pag_USR_AGENDA, - Pag_MY_AGENDA, + Pag_USR_AGENDA, // Agd_USR_AGENDA_NOW, not used + Pag_USR_AGENDA, // Agd_USR_AGENDA + Pag_MY_AGENDA, // Agd_MY_AGENDA_NOW, not used + Pag_MY_AGENDA, // Agd_MY_AGENDA }; /***** Get parameters *****/ @@ -213,83 +284,13 @@ static void Agd_ShowEvents (Agd_AgendaType_t AgendaType) if (Pagination.MoreThanOnePage) Pag_WriteLinksToPagesCentered (WhatPaginate[AgendaType],0,&Pagination); - switch (AgendaType) - { - case Agd_USR_AGENDA: - /***** Start frame *****/ - sprintf (Gbl.Title,Txt_Public_agenda_USER,Gbl.Usrs.Other.UsrDat.FullName); - ItsMe = (Gbl.Usrs.Me.UsrDat.UsrCod == Gbl.Usrs.Other.UsrDat.UsrCod); - Lay_StartRoundFrame ("100%",Gbl.Title, - ItsMe ? Agd_PutIconToViewEditMyAgenda : - NULL, - Hlp_PROFILE_Agenda); // TODO: Change - break; - case Agd_MY_AGENDA: - /***** Start frame *****/ - switch (Gbl.Agenda.WhichEvents) - { - case Agd_ALL_EVENTS: - Lay_StartRoundFrame ("100%",Txt_My_agenda, - Agd_PutIconsListEvents, - Hlp_PROFILE_Agenda); - break; - case Agd_ONLY_PUBLIC_EVENTS: - sprintf (Gbl.Title,Txt_Public_agenda_USER,Gbl.Usrs.Me.UsrDat.FullName); - Lay_StartRoundFrame ("100%",Gbl.Title, - Agd_PutIconsListEvents, - Hlp_PROFILE_Agenda); - break; - } - - /***** Put form to choice whether to show - all events or only public events *****/ - Act_FormStart (ActSeeMyAgd); - Agd_ShowFormToSelWhichEvents (ActSeeMyAgd); - Act_FormEnd (); - break; - } - if (Gbl.Agenda.Num) { + /***** Start table *****/ + fprintf (Gbl.F.Out,""); + /***** Table head *****/ - fprintf (Gbl.F.Out,"
" - ""); - for (Order = Agd_ORDER_BY_START_DATE; - Order <= Agd_ORDER_BY_END_DATE; - Order++) - { - fprintf (Gbl.F.Out,""); - } - fprintf (Gbl.F.Out,"" - "" - "", - Txt_Event, - Txt_Location); + Agd_WriteHeaderListEvents (AgendaType); /***** Write all the events *****/ for (NumEvent = Pagination.FirstItemVisible; @@ -300,24 +301,118 @@ static void Agd_ShowEvents (Agd_AgendaType_t AgendaType) /***** End table *****/ fprintf (Gbl.F.Out,"
"); - switch (AgendaType) - { - case Agd_USR_AGENDA: - Act_FormStart (ActSeeUsrAgd); - Usr_PutParamOtherUsrCodEncrypted (); - break; - case Agd_MY_AGENDA: - Act_FormStart (ActSeeMyAgd); - break; - } - Pag_PutHiddenParamPagNum (Gbl.Pag.CurrentPage); - Par_PutHiddenParamUnsigned ("Order",(unsigned) Order); - Act_LinkFormSubmit (Txt_ASG_ATT_OR_SVY_HELP_ORDER[Order],"TIT_TBL",NULL); - if (Order == Gbl.Agenda.SelectedOrderType) - fprintf (Gbl.F.Out,""); - fprintf (Gbl.F.Out,"%s",Txt_ASG_ATT_OR_SVY_ORDER[Order]); - if (Order == Gbl.Agenda.SelectedOrderType) - fprintf (Gbl.F.Out,""); - fprintf (Gbl.F.Out,""); - Act_FormEnd (); - fprintf (Gbl.F.Out,"" - "%s" - "" - "%s" - "
"); } - else // No events created + else Lay_ShowAlert (Lay_INFO,Txt_No_events); - /***** Button to create a new event *****/ - if (AgendaType == Agd_MY_AGENDA) - Agd_PutButtonToCreateNewEvent (); - - /***** End frame *****/ - Lay_EndRoundFrame (); - /***** Write again links to pages *****/ if (Pagination.MoreThanOnePage) Pag_WriteLinksToPagesCentered (WhatPaginate[AgendaType],0,&Pagination); + /***** Button to create a new event *****/ + if (AgendaType == Agd_MY_AGENDA) + Agd_PutButtonToCreateNewEvent (); + /***** Free list of events *****/ Agd_FreeListEvents (); } +/*****************************************************************************/ +/*********************** Show current events in agenda ***********************/ +/*****************************************************************************/ + +static void Agd_ShowEventsNow (Agd_AgendaType_t AgendaType) + { + extern const char *Hlp_PROFILE_Agenda; + extern const char *Txt_Now; + extern const char *Txt_Public_agenda_USER; + extern const char *Txt_My_agenda; + extern const char *Txt_No_events; + unsigned NumEvent; + + /***** Get parameters *****/ + Agd_GetParamEventOrderType (); + + /***** Get list of events *****/ + Agd_GetListEvents (AgendaType); + + if (Gbl.Agenda.Num) + { + /***** Start frame *****/ + Lay_StartRoundFrameTable (NULL,Txt_Now, + NULL, + Hlp_PROFILE_Agenda,2); // TODO: Change + + /***** Table head *****/ + Agd_WriteHeaderListEvents (AgendaType); + + /***** Write all the events *****/ + for (NumEvent = 0; + NumEvent < Gbl.Agenda.Num; + NumEvent++) + Agd_ShowOneEvent (AgendaType,Gbl.Agenda.LstAgdCods[NumEvent]); + + /***** End table and frame *****/ + Lay_EndRoundFrameTable (); + } + + /***** Free list of events *****/ + Agd_FreeListEvents (); + } + +/*****************************************************************************/ +/*************** Put contextual icon to view/edit my agenda ******************/ +/*****************************************************************************/ + +static void Agd_WriteHeaderListEvents (Agd_AgendaType_t AgendaType) + { + extern const char *Txt_ASG_ATT_OR_SVY_HELP_ORDER[2]; + extern const char *Txt_ASG_ATT_OR_SVY_ORDER[2]; + extern const char *Txt_Event; + extern const char *Txt_Location; + Agd_Order_t Order; + + /***** Table head *****/ + fprintf (Gbl.F.Out,""); + for (Order = Agd_ORDER_BY_START_DATE; + Order <= Agd_ORDER_BY_END_DATE; + Order++) + { + fprintf (Gbl.F.Out,""); + switch (AgendaType) + { + case Agd_USR_AGENDA_NOW: + case Agd_USR_AGENDA: + Act_FormStart (ActSeeUsrAgd); + Usr_PutParamOtherUsrCodEncrypted (); + break; + case Agd_MY_AGENDA_NOW: + case Agd_MY_AGENDA: + Act_FormStart (ActSeeMyAgd); + break; + } + Pag_PutHiddenParamPagNum (Gbl.Pag.CurrentPage); + Par_PutHiddenParamUnsigned ("Order",(unsigned) Order); + Act_LinkFormSubmit (Txt_ASG_ATT_OR_SVY_HELP_ORDER[Order],"TIT_TBL",NULL); + if (Order == Gbl.Agenda.SelectedOrderType) + fprintf (Gbl.F.Out,""); + fprintf (Gbl.F.Out,"%s",Txt_ASG_ATT_OR_SVY_ORDER[Order]); + if (Order == Gbl.Agenda.SelectedOrderType) + fprintf (Gbl.F.Out,""); + fprintf (Gbl.F.Out,""); + Act_FormEnd (); + fprintf (Gbl.F.Out,""); + } + fprintf (Gbl.F.Out,"" + "%s" + "" + "" + "%s" + "" + "", + Txt_Event, + Txt_Location); + } + /*****************************************************************************/ /*************** Put contextual icon to view/edit my agenda ******************/ /*****************************************************************************/ @@ -473,9 +568,11 @@ static void Agd_ShowOneEvent (Agd_AgendaType_t AgendaType,long AgdCod) AgdEvent.AgdCod = AgdCod; switch (AgendaType) { + case Agd_USR_AGENDA_NOW: case Agd_USR_AGENDA: AgdEvent.UsrCod = Gbl.Usrs.Other.UsrDat.UsrCod; break; + case Agd_MY_AGENDA_NOW: case Agd_MY_AGENDA: AgdEvent.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod; break; @@ -615,12 +712,18 @@ static void Agd_GetParamEventOrderType (void) { char UnsignedStr[10+1]; unsigned UnsignedNum; + static bool AlreadyGot = false; - Par_GetParToText ("Order",UnsignedStr,10); - if (sscanf (UnsignedStr,"%u",&UnsignedNum) == 1) - Gbl.Agenda.SelectedOrderType = (Agd_Order_t) UnsignedNum; - else - Gbl.Agenda.SelectedOrderType = Agd_DEFAULT_ORDER_TYPE; + if (!AlreadyGot) + { + Par_GetParToText ("Order",UnsignedStr,10); + if (sscanf (UnsignedStr,"%u",&UnsignedNum) == 1) + Gbl.Agenda.SelectedOrderType = (Agd_Order_t) UnsignedNum; + else + Gbl.Agenda.SelectedOrderType = Agd_DEFAULT_ORDER_TYPE; + + AlreadyGot = true; + } } /*****************************************************************************/ @@ -674,7 +777,7 @@ static void Agd_PutFormsToRemEditOneEvent (struct AgendaEvent *AgdEvent) NULL); /***** Put form to make event public/private *****/ - if (Gbl.Usrs.Me.AvailableRoles & (1 << Rol_TEACHER)) // I am a teacher in some courses + if (Gbl.Usrs.Me.UsrDat.Roles & (1 << Rol_TEACHER)) // I am a teacher in some courses { if (AgdEvent->Public) Lay_PutContextualLink (ActPrvEvtMyAgd,Agd_PutParams, @@ -736,6 +839,13 @@ static void Agd_GetListEvents (Agd_AgendaType_t AgendaType) } switch (AgendaType) { + case Agd_USR_AGENDA_NOW: + sprintf (Query,"SELECT AgdCod FROM agendas" + " WHERE UsrCod='%ld' AND Public='Y' AND Hidden='N'" + " AND StartTime<=NOW() AND EndTime>=NOW()" // Only present events + " ORDER BY %s", + Gbl.Usrs.Other.UsrDat.UsrCod,OrderBySubQuery); + break; case Agd_USR_AGENDA: sprintf (Query,"SELECT AgdCod FROM agendas" " WHERE UsrCod='%ld' AND Public='Y' AND Hidden='N'" @@ -743,6 +853,13 @@ static void Agd_GetListEvents (Agd_AgendaType_t AgendaType) " ORDER BY %s", Gbl.Usrs.Other.UsrDat.UsrCod,OrderBySubQuery); break; + case Agd_MY_AGENDA_NOW: + sprintf (Query,"SELECT AgdCod FROM agendas" + " WHERE UsrCod='%ld' AND Public='Y' AND Hidden='N'" + " AND StartTime<=NOW() AND EndTime>=NOW()" // Only present events + " ORDER BY %s", + Gbl.Usrs.Me.UsrDat.UsrCod,OrderBySubQuery); + break; case Agd_MY_AGENDA: switch (Gbl.Agenda.WhichEvents) { @@ -754,7 +871,7 @@ static void Agd_GetListEvents (Agd_AgendaType_t AgendaType) break; case Agd_ONLY_PUBLIC_EVENTS: sprintf (Query,"SELECT AgdCod FROM agendas" - " WHERE UsrCod='%ld' AND Public='Y'" + " WHERE UsrCod='%ld' AND Public='Y' AND Hidden='N'" " ORDER BY %s", Gbl.Usrs.Me.UsrDat.UsrCod,OrderBySubQuery); break; @@ -1303,7 +1420,7 @@ void Agd_RequestCreatOrEditEvent (void) Act_FormEnd (); /***** Show current events, if any *****/ - Agd_ShowEvents (Agd_MY_AGENDA); + Agd_ShowMyAgenda (); } /*****************************************************************************/ diff --git a/swad_changelog.h b/swad_changelog.h index 7233a0d8e..f5f98d391 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -179,20 +179,19 @@ // TODO: When teacher sees "No hay estudiantes", put a button to add students // TODO: When admin sees "No hay profesores", put a button to add teachers -// TODO: Do not show hidden events of my agenda when selected "Only public events" - /*****************************************************************************/ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 16.87.2 (2016-12-05)" +#define Log_PLATFORM_VERSION "SWAD 16.88 (2016-12-06)" #define CSS_FILE "swad16.86.5.css" #define JS_FILE "swad16.84.2.js" // 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 16.87.2: Dec 05, 2016 Icon to edit user's agenda. (209987 lines) + Version 16.88: Dec 06, 2016 Current events in user's agenda are displayed in a highlighted box. (210102 lines) + Version 16.87.2: Dec 05, 2016 Icon to edit my agenda. (209987 lines) Version 16.87.1: Dec 05, 2016 Temporary permissions to debug agendas. (209969 lines) Copy the following icons to icon public directory: sudo cp icon/lock-on64x64.png /var/www/html/swad/icon/ diff --git a/swad_text.c b/swad_text.c index b58b359fe..5da8ab4a1 100644 --- a/swad_text.c +++ b/swad_text.c @@ -26868,6 +26868,27 @@ const char *Txt_Notify_me_BR_by_email = "Notifique-me
por email"; #endif +const char *Txt_Now = +#if L==1 + "Ara"; +#elif L==2 + "Jetzt"; +#elif L==3 + "Now"; +#elif L==4 + "Ahora"; +#elif L==5 + "Maintenant"; +#elif L==6 + "Ko'ãga"; +#elif L==7 + "Ora"; +#elif L==8 + "Teraz"; +#elif L==9 + "Agora"; +#endif + const char *Txt_Now_each_student_can_belong_to_multiple_groups_of_type_X = // Warning: it is very important to include %s in the following sentences #if L==1 "Ahora cada estudiante puede pertenecer a varios grupos de tipo %s."; // Necessita traduccio