Version 16.88

This commit is contained in:
Antonio Cañas Vargas 2016-12-06 03:10:06 +01:00
parent 820a6779e6
commit 68f7e8bad7
3 changed files with 240 additions and 103 deletions

View File

@ -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 class=\"FRAME_TBL_MARGIN CELLS_PAD_2\">");
/***** Table head *****/
fprintf (Gbl.F.Out,"<table class=\"FRAME_TBL_MARGIN CELLS_PAD_2\">"
"<tr>");
for (Order = Agd_ORDER_BY_START_DATE;
Order <= Agd_ORDER_BY_END_DATE;
Order++)
{
fprintf (Gbl.F.Out,"<th class=\"LEFT_MIDDLE\">");
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,"<u>");
fprintf (Gbl.F.Out,"%s",Txt_ASG_ATT_OR_SVY_ORDER[Order]);
if (Order == Gbl.Agenda.SelectedOrderType)
fprintf (Gbl.F.Out,"</u>");
fprintf (Gbl.F.Out,"</a>");
Act_FormEnd ();
fprintf (Gbl.F.Out,"</th>");
}
fprintf (Gbl.F.Out,"<th class=\"LEFT_MIDDLE\">"
"%s"
"</th>"
"<th class=\"LEFT_MIDDLE\">"
"%s"
"</th>"
"</tr>",
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,"</table>");
}
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,"<tr>");
for (Order = Agd_ORDER_BY_START_DATE;
Order <= Agd_ORDER_BY_END_DATE;
Order++)
{
fprintf (Gbl.F.Out,"<th class=\"LEFT_MIDDLE\">");
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,"<u>");
fprintf (Gbl.F.Out,"%s",Txt_ASG_ATT_OR_SVY_ORDER[Order]);
if (Order == Gbl.Agenda.SelectedOrderType)
fprintf (Gbl.F.Out,"</u>");
fprintf (Gbl.F.Out,"</a>");
Act_FormEnd ();
fprintf (Gbl.F.Out,"</th>");
}
fprintf (Gbl.F.Out,"<th class=\"LEFT_MIDDLE\">"
"%s"
"</th>"
"<th class=\"LEFT_MIDDLE\">"
"%s"
"</th>"
"</tr>",
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 ();
}
/*****************************************************************************/

View File

@ -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/

View File

@ -26868,6 +26868,27 @@ const char *Txt_Notify_me_BR_by_email =
"Notifique-me<br />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'&atilde;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 <strong>%s</strong>."; // Necessita traduccio