Version18.88

This commit is contained in:
Antonio Cañas Vargas 2019-03-25 19:05:10 +01:00
parent 360cb0aaca
commit ea15787436
24 changed files with 348 additions and 263 deletions

View File

@ -1715,9 +1715,8 @@ a:hover /* Default ==> underlined */
{ {
display:inline-block; display:inline-block;
box-sizing:border-box; box-sizing:border-box;
margin:5px 0 18px 0; margin:5px 0;
padding:12px; padding:8px 12px 20px 12px;
background-color:rgba(255,255,255,0.95);
border-width:1px; border-width:1px;
border-style:solid; border-style:solid;
border-color:#C0C0C0; border-color:#C0C0C0;
@ -1725,6 +1724,12 @@ a:hover /* Default ==> underlined */
box-shadow:2px 5px 15px #888; box-shadow:2px 5px 15px #888;
text-align:center; text-align:center;
overflow:hidden; overflow:hidden;
background-color:#ddecf1;
animation: fadein 2s linear forwards;
}
@keyframes fadein
{
to {background-color:white;}
} }
.FRAME_ICO .FRAME_ICO
{ {

View File

@ -1346,6 +1346,7 @@ function DrawMonth (id,FirstDayOfWeek,YearToDraw,MonthToDraw,CurrentMonth,Curren
var Yea = YearToDraw; var Yea = YearToDraw;
var Mon = MonthToDraw; var Mon = MonthToDraw;
var Day; var Day;
var ExaCod;
var StrMon; var StrMon;
var StrDay; var StrDay;
var StrDate; var StrDate;
@ -1484,12 +1485,13 @@ function DrawMonth (id,FirstDayOfWeek,YearToDraw,MonthToDraw,CurrentMonth,Curren
Day == LstExamAnnouncements[NumExamAnnouncement].Day) { Day == LstExamAnnouncements[NumExamAnnouncement].Day) {
ThisDayHasEvent = true; ThisDayHasEvent = true;
if (!PrintView) { if (!PrintView) {
ExaCod = LstExamAnnouncements[NumExamAnnouncement].ExaCod;
StrMon = ((Mon < 10) ? '0' : '') + Mon; StrMon = ((Mon < 10) ? '0' : '') + Mon;
StrDay = ((Day < 10) ? '0' : '') + Day; StrDay = ((Day < 10) ? '0' : '') + Day;
StrDate = Yea + '-' + StrMon + '-' + StrDay; StrDate = Yea + StrMon + StrDay; // YYYYMMDD
TextForDay = STR_EXAM + ': ' + StrDate; TextForDay = STR_EXAM;
} }
break; break; // Only last exam in the day (list is ordered from more recent to older)
} }
/***** Write the box with the day *****/ /***** Write the box with the day *****/
@ -1504,7 +1506,10 @@ function DrawMonth (id,FirstDayOfWeek,YearToDraw,MonthToDraw,CurrentMonth,Curren
if (!PrintView && ThisDayHasEvent) { if (!PrintView && ThisDayHasEvent) {
FormIdNum++; FormIdNum++;
FormId = id + '_event_' + FormIdNum; FormId = id + '_event_' + FormIdNum;
Gbl_HTMLContent += '<form method="post" action="' + CGI + '" id="' + FormId + '">' + Gbl_HTMLContent += '<form method="post" action="' +
CGI + '#' + 'exam_' +
ExaCod +
'" id="' + FormId + '">' +
FormEventParams + FormEventParams +
'<input type="hidden" name=\"Date\" value="' + '<input type="hidden" name=\"Date\" value="' +
StrDate + StrDate +

View File

@ -2155,8 +2155,8 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActPrnExaAnn */{ 179,-1,TabUnk,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,NULL ,Exa_PrintExamAnnouncement ,NULL}, /* ActPrnExaAnn */{ 179,-1,TabUnk,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,NULL ,Exa_PrintExamAnnouncement ,NULL},
/* ActReqRemExaAnn */{1619,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Exa_ReqRemoveExamAnnouncement ,NULL}, /* ActReqRemExaAnn */{1619,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Exa_ReqRemoveExamAnnouncement ,NULL},
/* ActRemExaAnn */{ 187,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Exa_RemoveExamAnnouncement1 ,Exa_RemoveExamAnnouncement2 ,NULL}, /* ActRemExaAnn */{ 187,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Exa_RemoveExamAnnouncement1 ,Exa_RemoveExamAnnouncement2 ,NULL},
/* ActHidExaAnn */{1620,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Exa_HideExamAnnouncement1 ,Exa_HideExamAnnouncement2 ,NULL}, /* ActHidExaAnn */{1620,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Exa_HideExamAnnouncement ,Exa_ListExamAnnouncementsEdit ,NULL},
/* ActShoExaAnn */{1621,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Exa_UnhideExamAnnouncement1 ,Exa_UnhideExamAnnouncement2 ,NULL}, /* ActShoExaAnn */{1621,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Exa_UnhideExamAnnouncement ,Exa_ListExamAnnouncementsEdit ,NULL},
// TabFil ****************************************************************** // TabFil ******************************************************************
// Actions in menu: // Actions in menu:

View File

@ -836,9 +836,9 @@ static void Agd_PutFormsToRemEditOneEvent (struct AgendaEvent *AgdEvent)
/***** Put form to hide/show event *****/ /***** Put form to hide/show event *****/
if (AgdEvent->Hidden) if (AgdEvent->Hidden)
Ico_PutContextualIconToUnhide (ActShoEvtMyAgd,Agd_PutCurrentParamsMyAgenda); Ico_PutContextualIconToUnhide (ActShoEvtMyAgd,NULL,Agd_PutCurrentParamsMyAgenda);
else else
Ico_PutContextualIconToHide (ActHidEvtMyAgd,Agd_PutCurrentParamsMyAgenda); Ico_PutContextualIconToHide (ActHidEvtMyAgd,NULL,Agd_PutCurrentParamsMyAgenda);
/***** Put form to edit event *****/ /***** Put form to edit event *****/
Ico_PutContextualIconToEdit (ActEdiOneEvtMyAgd,Agd_PutCurrentParamsMyAgenda); Ico_PutContextualIconToEdit (ActEdiOneEvtMyAgd,Agd_PutCurrentParamsMyAgenda);

View File

@ -30,6 +30,7 @@
#include <stdarg.h> // For va_start, va_end #include <stdarg.h> // For va_start, va_end
#include <stdio.h> // For FILE, fprintf, vasprintf #include <stdio.h> // For FILE, fprintf, vasprintf
#include <stdlib.h> // For free #include <stdlib.h> // For free
#include <string.h> // For string functions
#include "swad_alert.h" #include "swad_alert.h"
#include "swad_form.h" #include "swad_form.h"
@ -84,21 +85,25 @@ void Ale_CreateAlert (Ale_AlertType_t Type,const char *Section,
{ {
va_list ap; va_list ap;
int NumBytesPrinted; int NumBytesPrinted;
size_t i;
if (Gbl.Alerts.Num + 1 > Ale_MAX_ALERTS) if (Gbl.Alerts.Num + 1 > Ale_MAX_ALERTS)
Lay_ShowErrorAndExit ("Too many alerts."); Lay_ShowErrorAndExit ("Too many alerts.");
i = Gbl.Alerts.Num;
Gbl.Alerts.Num++; Gbl.Alerts.Num++;
Gbl.Alerts.List[Gbl.Alerts.Num - 1].Type = Type; Gbl.Alerts.List[i].Type = Type;
Gbl.Alerts.List[Gbl.Alerts.Num - 1].Section = NULL; Gbl.Alerts.List[i].Section = NULL;
if (Section) if (Section)
if (Section[0]) if (Section[0])
Gbl.Alerts.List[Gbl.Alerts.Num - 1].Section = Section; if (asprintf (&Gbl.Alerts.List[i].Section,"%s",
Section) < 0)
Lay_NotEnoughMemoryExit ();
va_start (ap,fmt); va_start (ap,fmt);
NumBytesPrinted = vasprintf (&Gbl.Alerts.List[Gbl.Alerts.Num - 1].Text,fmt,ap); NumBytesPrinted = vasprintf (&Gbl.Alerts.List[i].Text,fmt,ap);
va_end (ap); va_end (ap);
if (NumBytesPrinted < 0) // If memory allocation wasn't possible, if (NumBytesPrinted < 0) // If memory allocation wasn't possible,
@ -111,7 +116,7 @@ void Ale_CreateAlert (Ale_AlertType_t Type,const char *Section,
/***************** Get current number of delayed alerts **********************/ /***************** Get current number of delayed alerts **********************/
/*****************************************************************************/ /*****************************************************************************/
unsigned Ale_GetNumAlerts (void) size_t Ale_GetNumAlerts (void)
{ {
return Gbl.Alerts.Num; return Gbl.Alerts.Num;
} }
@ -174,7 +179,6 @@ static void Ale_ResetAlert (size_t i)
{ {
/***** Reset i-esim alert *****/ /***** Reset i-esim alert *****/
Gbl.Alerts.List[i].Type = Ale_NONE; // Reset alert Gbl.Alerts.List[i].Type = Ale_NONE; // Reset alert
Gbl.Alerts.List[i].Section = NULL;
/***** Free memory allocated for text *****/ /***** Free memory allocated for text *****/
if (Gbl.Alerts.List[i].Text) if (Gbl.Alerts.List[i].Text)
@ -182,6 +186,13 @@ static void Ale_ResetAlert (size_t i)
free ((void *) Gbl.Alerts.List[i].Text); free ((void *) Gbl.Alerts.List[i].Text);
Gbl.Alerts.List[i].Text = NULL; Gbl.Alerts.List[i].Text = NULL;
} }
/***** Free memory allocated for section *****/
if (Gbl.Alerts.List[i].Section)
{
free ((void *) Gbl.Alerts.List[i].Section);
Gbl.Alerts.List[i].Section = NULL;
}
} }
/***** Set number of alerts to 0 /***** Set number of alerts to 0
@ -218,14 +229,17 @@ void Ale_ShowAlerts (const char *Section)
{ {
size_t i; size_t i;
bool ShowAlert; bool ShowAlert;
size_t NumAlerts = Ale_GetNumAlerts ();
for (i = 0; for (i = 0;
i < Gbl.Alerts.Num; i < NumAlerts;
i++) i++)
if (Gbl.Alerts.List[i].Type != Ale_NONE) if (Gbl.Alerts.List[i].Type != Ale_NONE)
{ {
ShowAlert = Section ? (Gbl.Alerts.List[i].Section == Section) : if (Section)
true; ShowAlert = (bool) !strcmp (Gbl.Alerts.List[i].Section,Section);
else
ShowAlert = false;
if (ShowAlert) if (ShowAlert)
{ {

View File

@ -60,7 +60,7 @@ typedef enum
void Ale_CreateAlert (Ale_AlertType_t Type,const char *Section, void Ale_CreateAlert (Ale_AlertType_t Type,const char *Section,
const char *fmt,...); const char *fmt,...);
unsigned Ale_GetNumAlerts (void); size_t Ale_GetNumAlerts (void);
Ale_AlertType_t Ale_GetTypeOfLastAlert (void); Ale_AlertType_t Ale_GetTypeOfLastAlert (void);
const char *Ale_GetTextOfLastAlert (void); const char *Ale_GetTextOfLastAlert (void);

View File

@ -546,9 +546,9 @@ static void Asg_PutFormsToRemEditOneAsg (long AsgCod,bool Hidden)
/***** Put form to hide/show assignment *****/ /***** Put form to hide/show assignment *****/
if (Hidden) if (Hidden)
Ico_PutContextualIconToUnhide (ActShoAsg,Asg_PutParams); Ico_PutContextualIconToUnhide (ActShoAsg,NULL,Asg_PutParams);
else else
Ico_PutContextualIconToHide (ActHidAsg,Asg_PutParams); Ico_PutContextualIconToHide (ActHidAsg,NULL,Asg_PutParams);
/***** Put form to edit assignment *****/ /***** Put form to edit assignment *****/
Ico_PutContextualIconToEdit (ActEdiOneAsg,Asg_PutParams); Ico_PutContextualIconToEdit (ActEdiOneAsg,Asg_PutParams);

View File

@ -570,9 +570,9 @@ static void Att_PutFormsToRemEditOneAttEvent (long AttCod,bool Hidden)
/***** Put form to hide/show attendance event *****/ /***** Put form to hide/show attendance event *****/
if (Hidden) if (Hidden)
Ico_PutContextualIconToUnhide (ActShoAtt,Att_PutParams); Ico_PutContextualIconToUnhide (ActShoAtt,NULL,Att_PutParams);
else else
Ico_PutContextualIconToHide (ActHidAtt,Att_PutParams); Ico_PutContextualIconToHide (ActHidAtt,NULL,Att_PutParams);
/***** Put form to edit attendance event *****/ /***** Put form to edit attendance event *****/
Ico_PutContextualIconToEdit (ActEdiOneAtt,Att_PutParams); Ico_PutContextualIconToEdit (ActEdiOneAtt,Att_PutParams);

View File

@ -58,9 +58,9 @@ extern struct Globals Gbl;
/*****************************************************************************/ /*****************************************************************************/
static void Box_StartBoxInternal (const char *Width,const char *Title, static void Box_StartBoxInternal (const char *Width,const char *Title,
void (*FunctionToDrawContextualIcons) (void), void (*FunctionToDrawContextualIcons) (void),
const char *HelpLink,Box_Closable_t Closable, const char *HelpLink,Box_Closable_t Closable,
const char *ClassFrame); const char *ClassFrame);
/*****************************************************************************/ /*****************************************************************************/
/******************* Start and end a table with rounded box ******************/ /******************* Start and end a table with rounded box ******************/
@ -109,9 +109,9 @@ void Box_StartBoxShadow (const char *Width,const char *Title,
} }
static void Box_StartBoxInternal (const char *Width,const char *Title, static void Box_StartBoxInternal (const char *Width,const char *Title,
void (*FunctionToDrawContextualIcons) (void), void (*FunctionToDrawContextualIcons) (void),
const char *HelpLink,Box_Closable_t Closable, const char *HelpLink,Box_Closable_t Closable,
const char *ClassFrame) const char *ClassFrame)
{ {
extern const char *Txt_Help; extern const char *Txt_Help;
extern const char *Txt_Close; extern const char *Txt_Close;

View File

@ -443,9 +443,6 @@ Lo de mutear anuncios, en principio prefiero hacer una opci
// TODO: Actualizar ayuda en GitHub, por ejemplo Preferencias ahora es Ajustes. // TODO: Actualizar ayuda en GitHub, por ejemplo Preferencias ahora es Ajustes.
// TODO: Change in usability of Announcements of exams, suggested by Javier Fernández Baldomero.
// TODO: Al pulsar sobre una convocatoria de examen --> ir a la sección de esa convocatoria/aviso en lugar de mostrarlo repetido y destacado arriba
// TODO: Allow timeline posting only for users belonging to courses or admins to avoid user who create accounts only to post // TODO: Allow timeline posting only for users belonging to courses or admins to avoid user who create accounts only to post
// TODO: Ver cómo recibir un fichero desde el cliente (SWADroid) en gsoap // TODO: Ver cómo recibir un fichero desde el cliente (SWADroid) en gsoap
@ -469,10 +466,11 @@ En OpenSWAD:
ps2pdf source.ps destination.pdf ps2pdf source.ps destination.pdf
*/ */
#define Log_PLATFORM_VERSION "SWAD 18.87.1 (2019-03-24)" #define Log_PLATFORM_VERSION "SWAD 18.88 (2019-03-25)"
#define CSS_FILE "swad18.87.css" #define CSS_FILE "swad18.88.css"
#define JS_FILE "swad18.85.js" #define JS_FILE "swad18.88.js"
/* /*
Version 18.88: Mar 25, 2019 Change in usability of exam announcements, suggested by Mancia Anguita López and Javier Fernández Baldomero. (241089 lines)
Version 18.87.1: Mar 24, 2019 Code refactoring in notices. (241011 lines) Version 18.87.1: Mar 24, 2019 Code refactoring in notices. (241011 lines)
Version 18.87: Mar 24, 2019 Change in usability of notices. (240997 lines) Version 18.87: Mar 24, 2019 Change in usability of notices. (240997 lines)
Version 18.86.3: Mar 24, 2019 Optimization in suggestion of users to follow. (240965 lines) Version 18.86.3: Mar 24, 2019 Optimization in suggestion of users to follow. (240965 lines)

View File

@ -75,15 +75,16 @@ extern struct Globals Gbl;
static long Exa_GetParamsExamAnnouncement (void); static long Exa_GetParamsExamAnnouncement (void);
static void Exa_AllocMemExamAnnouncement (void); static void Exa_AllocMemExamAnnouncement (void);
static void Exa_UpdateNumUsrsNotifiedByEMailAboutExamAnnouncement (long ExaCod,unsigned NumUsrsToBeNotifiedByEMail); static void Exa_UpdateNumUsrsNotifiedByEMailAboutExamAnnouncement (long ExaCod,unsigned NumUsrsToBeNotifiedByEMail);
static void Exa_ListExamAnnouncementsEdit (void);
static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement); static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement);
static void Exa_PutIconToCreateNewExamAnnouncement (void); static void Exa_PutIconToCreateNewExamAnnouncement (void);
static void Exa_PutButtonToCreateNewExamAnnouncement (void); static void Exa_PutButtonToCreateNewExamAnnouncement (void);
static long Exa_AddExamAnnouncementToDB (void); static long Exa_AddExamAnnouncementToDB (void);
static void Exa_ModifyExamAnnouncementInDB (void); static void Exa_ModifyExamAnnouncementInDB (long ExaCod);
static void Exa_GetDataExamAnnouncementFromDB (void); static void Exa_GetDataExamAnnouncementFromDB (long ExaCod);
static void Exa_ShowExamAnnouncement (Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement); static void Exa_ShowExamAnnouncement (long ExaCod,
Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement,
bool HighLight);
static void Exa_PutIconsExamAnnouncement (void); static void Exa_PutIconsExamAnnouncement (void);
static void Exa_PutParamExaCodToEdit (void); static void Exa_PutParamExaCodToEdit (void);
static long Exa_GetParamExaCod (void); static long Exa_GetParamExaCod (void);
@ -96,18 +97,21 @@ static void Exa_GetNotifContentExamAnnouncement (char **ContentStr);
void Exa_PutFrmEditAExamAnnouncement (void) void Exa_PutFrmEditAExamAnnouncement (void)
{ {
long ExaCod;
/***** Allocate memory for the exam announcement *****/ /***** Allocate memory for the exam announcement *****/
Exa_AllocMemExamAnnouncement (); Exa_AllocMemExamAnnouncement ();
/***** Get the code of the exam announcement *****/ /***** Get the code of the exam announcement *****/
Gbl.ExamAnns.ExaDat.ExaCod = Exa_GetParamsExamAnnouncement (); ExaCod = Exa_GetParamsExamAnnouncement ();
if (Gbl.ExamAnns.ExaDat.ExaCod > 0) // -1 indicates that this is a new exam announcement if (ExaCod > 0) // -1 indicates that this is a new exam announcement
/***** Read exam announcement from the database *****/ /***** Read exam announcement from the database *****/
Exa_GetDataExamAnnouncementFromDB (); Exa_GetDataExamAnnouncementFromDB (ExaCod);
/***** Show exam announcement *****/ /***** Show exam announcement *****/
Exa_ShowExamAnnouncement (Exa_FORM_VIEW); Exa_ShowExamAnnouncement (ExaCod,Exa_FORM_VIEW,
false); // Don't highlight
/***** Free memory of the exam announcement *****/ /***** Free memory of the exam announcement *****/
Exa_FreeMemExamAnnouncement (); Exa_FreeMemExamAnnouncement ();
@ -270,46 +274,56 @@ void Exa_FreeMemExamAnnouncement (void)
void Exa_ReceiveExamAnnouncement1 (void) void Exa_ReceiveExamAnnouncement1 (void)
{ {
extern const char *Txt_Created_new_announcement_of_exam;
extern const char *Txt_The_announcement_of_exam_has_been_successfully_updated;
long ExaCod;
bool NewExamAnnouncement;
char *Anchor = NULL;
/***** Allocate memory for the exam announcement *****/ /***** Allocate memory for the exam announcement *****/
Exa_AllocMemExamAnnouncement (); Exa_AllocMemExamAnnouncement ();
/***** Get parameters of the exam announcement *****/ /***** Get parameters of the exam announcement *****/
Gbl.ExamAnns.ExaDat.ExaCod = Exa_GetParamsExamAnnouncement (); ExaCod = Exa_GetParamsExamAnnouncement ();
Gbl.ExamAnns.NewExamAnnouncement = (Gbl.ExamAnns.ExaDat.ExaCod < 0); NewExamAnnouncement = (ExaCod < 0);
/***** Add the exam announcement to the database and read it again from the database *****/ /***** Add the exam announcement to the database and read it again from the database *****/
if (Gbl.ExamAnns.NewExamAnnouncement) if (NewExamAnnouncement)
Gbl.ExamAnns.ExaDat.ExaCod = Exa_AddExamAnnouncementToDB (); Gbl.ExamAnns.NewExaCod = ExaCod = Exa_AddExamAnnouncementToDB ();
else else
Exa_ModifyExamAnnouncementInDB (); Exa_ModifyExamAnnouncementInDB (ExaCod);
/***** Free memory of the exam announcement *****/ /***** Free memory of the exam announcement *****/
Exa_FreeMemExamAnnouncement (); Exa_FreeMemExamAnnouncement ();
/***** Create alert to show the change made *****/
Exa_SetAnchorStr (ExaCod,&Anchor);
Ale_CreateAlert (Ale_SUCCESS,Anchor,
NewExamAnnouncement ? Txt_Created_new_announcement_of_exam :
Txt_The_announcement_of_exam_has_been_successfully_updated);
Exa_FreeAnchorStr (Anchor);
/***** Set exam to be highlighted *****/
Gbl.ExamAnns.HighlightExaCod = ExaCod;
} }
void Exa_ReceiveExamAnnouncement2 (void) void Exa_ReceiveExamAnnouncement2 (void)
{ {
extern const char *Txt_Created_new_announcement_of_exam;
extern const char *Txt_The_announcement_of_exam_has_been_successfully_updated;
unsigned NumUsrsToBeNotifiedByEMail; unsigned NumUsrsToBeNotifiedByEMail;
struct TL_Publication SocPub; struct TL_Publication SocPub;
/***** Show message *****/
Ale_ShowAlert (Ale_SUCCESS,
Gbl.ExamAnns.NewExamAnnouncement ? Txt_Created_new_announcement_of_exam :
Txt_The_announcement_of_exam_has_been_successfully_updated);
/***** Notify by email about the new exam announcement *****/ /***** Notify by email about the new exam announcement *****/
if ((NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs (Ntf_EVENT_EXAM_ANNOUNCEMENT,Gbl.ExamAnns.ExaDat.ExaCod))) if ((NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs (Ntf_EVENT_EXAM_ANNOUNCEMENT,Gbl.ExamAnns.HighlightExaCod)))
Exa_UpdateNumUsrsNotifiedByEMailAboutExamAnnouncement (Gbl.ExamAnns.ExaDat.ExaCod,NumUsrsToBeNotifiedByEMail); Exa_UpdateNumUsrsNotifiedByEMailAboutExamAnnouncement (Gbl.ExamAnns.HighlightExaCod,NumUsrsToBeNotifiedByEMail);
/***** Create a new social note about the new exam announcement *****/ /***** Create a new social note about the new exam announcement *****/
TL_StoreAndPublishNote (TL_NOTE_EXAM_ANNOUNCEMENT,Gbl.ExamAnns.ExaDat.ExaCod,&SocPub); TL_StoreAndPublishNote (TL_NOTE_EXAM_ANNOUNCEMENT,Gbl.ExamAnns.HighlightExaCod,&SocPub);
/***** Update RSS of current course *****/ /***** Update RSS of current course *****/
RSS_UpdateRSSFileForACrs (&Gbl.CurrentCrs.Crs); RSS_UpdateRSSFileForACrs (&Gbl.CurrentCrs.Crs);
/***** Show exam announcement *****/ /***** Show exam announcements *****/
Exa_ListExamAnnouncementsEdit (); Exa_ListExamAnnouncementsEdit ();
} }
@ -333,18 +347,21 @@ static void Exa_UpdateNumUsrsNotifiedByEMailAboutExamAnnouncement (long ExaCod,u
void Exa_PrintExamAnnouncement (void) void Exa_PrintExamAnnouncement (void)
{ {
long ExaCod;
/***** Allocate memory for the exam announcement *****/ /***** Allocate memory for the exam announcement *****/
Exa_AllocMemExamAnnouncement (); Exa_AllocMemExamAnnouncement ();
/***** Get the code of the exam announcement *****/ /***** Get the code of the exam announcement *****/
if ((Gbl.ExamAnns.ExaDat.ExaCod = Exa_GetParamExaCod ()) <= 0) if ((ExaCod = Exa_GetParamExaCod ()) <= 0)
Lay_ShowErrorAndExit ("Code of exam announcement is missing."); Lay_ShowErrorAndExit ("Code of exam announcement is missing.");
/***** Read exam announcement from the database *****/ /***** Read exam announcement from the database *****/
Exa_GetDataExamAnnouncementFromDB (); Exa_GetDataExamAnnouncementFromDB (ExaCod);
/***** Show exam announcement *****/ /***** Show exam announcement *****/
Exa_ShowExamAnnouncement (Exa_PRINT_VIEW); Exa_ShowExamAnnouncement (ExaCod,Exa_PRINT_VIEW,
false); // Don't highlight
/***** Free memory of the exam announcement *****/ /***** Free memory of the exam announcement *****/
Exa_FreeMemExamAnnouncement (); Exa_FreeMemExamAnnouncement ();
@ -358,9 +375,10 @@ void Exa_ReqRemoveExamAnnouncement (void)
{ {
extern const char *Txt_Do_you_really_want_to_remove_the_following_announcement_of_exam; extern const char *Txt_Do_you_really_want_to_remove_the_following_announcement_of_exam;
extern const char *Txt_Remove; extern const char *Txt_Remove;
long ExaCod;
/***** Get the code of the exam announcement *****/ /***** Get the code of the exam announcement *****/
if ((Gbl.ExamAnns.ExaDat.ExaCod = Exa_GetParamExaCod ()) <= 0) if ((ExaCod = Exa_GetParamExaCod ()) <= 0)
Lay_ShowErrorAndExit ("Code of exam announcement is missing."); Lay_ShowErrorAndExit ("Code of exam announcement is missing.");
/***** Show question and button to remove exam announcement *****/ /***** Show question and button to remove exam announcement *****/
@ -369,11 +387,13 @@ void Exa_ReqRemoveExamAnnouncement (void)
/* Show announcement */ /* Show announcement */
Exa_AllocMemExamAnnouncement (); Exa_AllocMemExamAnnouncement ();
Exa_GetDataExamAnnouncementFromDB (); Exa_GetDataExamAnnouncementFromDB (ExaCod);
Exa_ShowExamAnnouncement (Exa_NORMAL_VIEW); Exa_ShowExamAnnouncement (ExaCod,Exa_NORMAL_VIEW,
false); // Don't highlight
Exa_FreeMemExamAnnouncement (); Exa_FreeMemExamAnnouncement ();
/* End alert */ /* End alert */
Ale_ShowAlertAndButton2 (ActRemExaAnn,NULL,NULL,Exa_PutParamExaCodToEdit, Ale_ShowAlertAndButton2 (ActRemExaAnn,NULL,NULL,Exa_PutParamExaCodToEdit,
Btn_REMOVE_BUTTON,Txt_Remove); Btn_REMOVE_BUTTON,Txt_Remove);
} }
@ -426,9 +446,11 @@ void Exa_RemoveExamAnnouncement2 (void)
// This function is splitted into a-priori and a-posteriori functions // This function is splitted into a-priori and a-posteriori functions
// in order to view updated links in month of left column // in order to view updated links in month of left column
void Exa_HideExamAnnouncement1 (void) void Exa_HideExamAnnouncement (void)
{ {
extern const char *Txt_The_announcement_of_exam_is_now_hidden;
long ExaCod; long ExaCod;
char *Anchor = NULL;
/***** Get the code of the exam announcement *****/ /***** Get the code of the exam announcement *****/
if ((ExaCod = Exa_GetParamExaCod ()) <= 0) if ((ExaCod = Exa_GetParamExaCod ()) <= 0)
@ -440,17 +462,15 @@ void Exa_HideExamAnnouncement1 (void)
" WHERE ExaCod=%ld AND CrsCod=%ld", " WHERE ExaCod=%ld AND CrsCod=%ld",
(unsigned) Exa_HIDDEN_EXAM_ANNOUNCEMENT, (unsigned) Exa_HIDDEN_EXAM_ANNOUNCEMENT,
ExaCod,Gbl.CurrentCrs.Crs.CrsCod); ExaCod,Gbl.CurrentCrs.Crs.CrsCod);
}
void Exa_HideExamAnnouncement2 (void) /***** Set exam to be highlighted *****/
{ Gbl.ExamAnns.HighlightExaCod = ExaCod;
extern const char *Txt_The_announcement_of_exam_is_now_hidden;
/***** Write message to show the change made *****/ /***** Create alert to show the change made *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_The_announcement_of_exam_is_now_hidden); Exa_SetAnchorStr (ExaCod,&Anchor);
Ale_CreateAlert (Ale_SUCCESS,Anchor,
/***** Show exam announcements again *****/ Txt_The_announcement_of_exam_is_now_hidden);
Exa_ListExamAnnouncementsEdit (); Exa_FreeAnchorStr (Anchor);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -459,9 +479,11 @@ void Exa_HideExamAnnouncement2 (void)
// This function is splitted into a-priori and a-posteriori functions // This function is splitted into a-priori and a-posteriori functions
// in order to view updated links in month of left column // in order to view updated links in month of left column
void Exa_UnhideExamAnnouncement1 (void) void Exa_UnhideExamAnnouncement (void)
{ {
extern const char *Txt_The_announcement_of_exam_is_now_visible;
long ExaCod; long ExaCod;
char *Anchor = NULL;
/***** Get the code of the exam announcement *****/ /***** Get the code of the exam announcement *****/
if ((ExaCod = Exa_GetParamExaCod ()) <= 0) if ((ExaCod = Exa_GetParamExaCod ()) <= 0)
@ -473,17 +495,15 @@ void Exa_UnhideExamAnnouncement1 (void)
" WHERE ExaCod=%ld AND CrsCod=%ld", " WHERE ExaCod=%ld AND CrsCod=%ld",
(unsigned) Exa_VISIBLE_EXAM_ANNOUNCEMENT, (unsigned) Exa_VISIBLE_EXAM_ANNOUNCEMENT,
ExaCod,Gbl.CurrentCrs.Crs.CrsCod); ExaCod,Gbl.CurrentCrs.Crs.CrsCod);
}
void Exa_UnhideExamAnnouncement2 (void) /***** Set exam to be highlighted *****/
{ Gbl.ExamAnns.HighlightExaCod = ExaCod;
extern const char *Txt_The_announcement_of_exam_is_now_visible;
/***** Write message to show the change made *****/ /***** Create alert to show the change made *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_The_announcement_of_exam_is_now_visible); Exa_SetAnchorStr (ExaCod,&Anchor);
Ale_CreateAlert (Ale_SUCCESS,Anchor,
/***** Show exam announcements again *****/ Txt_The_announcement_of_exam_is_now_visible);
Exa_ListExamAnnouncementsEdit (); Exa_FreeAnchorStr (Anchor);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -505,7 +525,7 @@ void Exa_ListExamAnnouncementsSee (void)
/********** List all the exam announcements to edit or remove them ***********/ /********** List all the exam announcements to edit or remove them ***********/
/*****************************************************************************/ /*****************************************************************************/
static void Exa_ListExamAnnouncementsEdit (void) void Exa_ListExamAnnouncementsEdit (void)
{ {
Exa_ListExamAnnouncements (Exa_NORMAL_VIEW); Exa_ListExamAnnouncements (Exa_NORMAL_VIEW);
} }
@ -527,9 +547,9 @@ void Exa_GetExaCodToHighlight (void)
void Exa_GetDateToHighlight (void) void Exa_GetDateToHighlight (void)
{ {
/***** Get the date (in YYYY-MM-DD format) /***** Get the date (in YYYYMMDD format)
of the exam announcements to highlight *****/ of the exam announcements to highlight *****/
Par_GetParToText ("Date",Gbl.ExamAnns.HighlightDate,4 + 1 + 2 + 1 + 2); Par_GetParToText ("Date",Gbl.ExamAnns.HighlightDate,4 + 2 + 2);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -539,7 +559,6 @@ void Exa_GetDateToHighlight (void)
static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement) static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement)
{ {
extern const char *Hlp_ASSESSMENT_Announcements; extern const char *Hlp_ASSESSMENT_Announcements;
extern const char *Txt_All_announcements_of_exams;
extern const char *Txt_Announcements_of_exams; extern const char *Txt_Announcements_of_exams;
extern const char *Txt_No_announcements_of_exams_of_X; extern const char *Txt_No_announcements_of_exams_of_X;
char SubQueryStatus[64]; char SubQueryStatus[64];
@ -547,6 +566,8 @@ static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewEx
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumExaAnn; unsigned long NumExaAnn;
unsigned long NumExaAnns; unsigned long NumExaAnns;
long ExaCod;
bool HighLight;
bool ICanEdit = (Gbl.Usrs.Me.Role.Logged == Rol_TCH || bool ICanEdit = (Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);
@ -558,84 +579,6 @@ static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewEx
sprintf (SubQueryStatus,"Status=%u", sprintf (SubQueryStatus,"Status=%u",
(unsigned) Exa_VISIBLE_EXAM_ANNOUNCEMENT); (unsigned) Exa_VISIBLE_EXAM_ANNOUNCEMENT);
/***** Show one highlighted exam announcement *****/
if (Gbl.ExamAnns.HighlightExaCod > 0)
{
/***** Get one exam announcement from database *****/
NumExaAnns = DB_QuerySELECT (&mysql_res,"can not get exam announcements"
" in this course for listing",
"SELECT ExaCod"
" FROM exam_announcements"
" WHERE ExaCod=%ld"
" AND CrsCod=%ld AND %s",
Gbl.ExamAnns.HighlightExaCod,
Gbl.CurrentCrs.Crs.CrsCod,SubQueryStatus);
/***** List the existing exam announcements *****/
for (NumExaAnn = 0;
NumExaAnn < NumExaAnns;
NumExaAnn++)
{
/***** Get the code of the exam announcement (row[0]) *****/
row = mysql_fetch_row (mysql_res);
if (sscanf (row[0],"%ld",&Gbl.ExamAnns.ExaDat.ExaCod) != 1)
Lay_ShowErrorAndExit ("Wrong code of exam announcement.");
/***** Allocate memory for the exam announcement *****/
Exa_AllocMemExamAnnouncement ();
/***** Read the data of the exam announcement *****/
Exa_GetDataExamAnnouncementFromDB ();
/***** Show exam announcement *****/
Exa_ShowExamAnnouncement (TypeViewExamAnnouncement);
/***** Free memory of the exam announcement *****/
Exa_FreeMemExamAnnouncement ();
}
}
/***** Show highlighted exam announcements of a date *****/
if (Gbl.ExamAnns.HighlightDate[0])
{
/***** Get exam announcements (the most recent first)
in current course for a date from database *****/
NumExaAnns = DB_QuerySELECT (&mysql_res,"can not get exam announcements"
" in this course for listing",
"SELECT ExaCod"
" FROM exam_announcements"
" WHERE CrsCod=%ld AND %s"
" AND DATE(ExamDate)='%s'"
" ORDER BY ExamDate DESC",
Gbl.CurrentCrs.Crs.CrsCod,SubQueryStatus,
Gbl.ExamAnns.HighlightDate);
/***** List the existing exam announcements *****/
for (NumExaAnn = 0;
NumExaAnn < NumExaAnns;
NumExaAnn++)
{
/***** Get the code of the exam announcement (row[0]) *****/
row = mysql_fetch_row (mysql_res);
if (sscanf (row[0],"%ld",&Gbl.ExamAnns.ExaDat.ExaCod) != 1)
Lay_ShowErrorAndExit ("Wrong code of exam announcement.");
/***** Allocate memory for the exam announcement *****/
Exa_AllocMemExamAnnouncement ();
/***** Read the data of the exam announcement *****/
Exa_GetDataExamAnnouncementFromDB ();
/***** Show exam announcement *****/
Exa_ShowExamAnnouncement (TypeViewExamAnnouncement);
/***** Free memory of the exam announcement *****/
Exa_FreeMemExamAnnouncement ();
}
}
/***** Get exam announcements (the most recent first) /***** Get exam announcements (the most recent first)
in current course from database *****/ in current course from database *****/
NumExaAnns = DB_QuerySELECT (&mysql_res,"can not get exam announcements" NumExaAnns = DB_QuerySELECT (&mysql_res,"can not get exam announcements"
@ -647,10 +590,7 @@ static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewEx
Gbl.CurrentCrs.Crs.CrsCod,SubQueryStatus); Gbl.CurrentCrs.Crs.CrsCod,SubQueryStatus);
/***** Start box *****/ /***** Start box *****/
Box_StartBox (NULL, Box_StartBox (NULL,Txt_Announcements_of_exams,
(Gbl.ExamAnns.HighlightExaCod > 0 ||
Gbl.ExamAnns.HighlightDate[0]) ? Txt_All_announcements_of_exams :
Txt_Announcements_of_exams,
ICanEdit ? Exa_PutIconToCreateNewExamAnnouncement : ICanEdit ? Exa_PutIconToCreateNewExamAnnouncement :
NULL, NULL,
Hlp_ASSESSMENT_Announcements,Box_NOT_CLOSABLE); Hlp_ASSESSMENT_Announcements,Box_NOT_CLOSABLE);
@ -668,17 +608,27 @@ static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewEx
/***** Get the code of the exam announcement (row[0]) *****/ /***** Get the code of the exam announcement (row[0]) *****/
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
if (sscanf (row[0],"%ld",&Gbl.ExamAnns.ExaDat.ExaCod) != 1) if (sscanf (row[0],"%ld",&ExaCod) != 1)
Lay_ShowErrorAndExit ("Wrong code of exam announcement."); Lay_ShowErrorAndExit ("Wrong code of exam announcement.");
/***** Allocate memory for the exam announcement *****/ /***** Allocate memory for the exam announcement *****/
Exa_AllocMemExamAnnouncement (); Exa_AllocMemExamAnnouncement ();
/***** Read the data of the exam announcement *****/ /***** Read the data of the exam announcement *****/
Exa_GetDataExamAnnouncementFromDB (); Exa_GetDataExamAnnouncementFromDB (ExaCod);
/***** Show exam announcement *****/ /***** Show exam announcement *****/
Exa_ShowExamAnnouncement (TypeViewExamAnnouncement); HighLight = false;
if (ExaCod == Gbl.ExamAnns.HighlightExaCod)
HighLight = true;
else if (Gbl.ExamAnns.HighlightDate[0])
{
if (!strcmp (Gbl.ExamAnns.ExaDat.ExamDate.YYYYMMDD,
Gbl.ExamAnns.HighlightDate))
HighLight = true;
}
Exa_ShowExamAnnouncement (ExaCod,TypeViewExamAnnouncement,
HighLight);
/***** Free memory of the exam announcement *****/ /***** Free memory of the exam announcement *****/
Exa_FreeMemExamAnnouncement (); Exa_FreeMemExamAnnouncement ();
@ -767,7 +717,7 @@ static long Exa_AddExamAnnouncementToDB (void)
/*************** Modify an exam announcement in the database *****************/ /*************** Modify an exam announcement in the database *****************/
/*****************************************************************************/ /*****************************************************************************/
static void Exa_ModifyExamAnnouncementInDB (void) static void Exa_ModifyExamAnnouncementInDB (long ExaCod)
{ {
/***** Modify exam announcement *****/ /***** Modify exam announcement *****/
DB_QueryUPDATE ("can not update an exam announcement", DB_QueryUPDATE ("can not update an exam announcement",
@ -795,7 +745,7 @@ static void Exa_ModifyExamAnnouncementInDB (void)
Gbl.ExamAnns.ExaDat.MatRequired, Gbl.ExamAnns.ExaDat.MatRequired,
Gbl.ExamAnns.ExaDat.MatAllowed, Gbl.ExamAnns.ExaDat.MatAllowed,
Gbl.ExamAnns.ExaDat.OtherInfo, Gbl.ExamAnns.ExaDat.OtherInfo,
Gbl.ExamAnns.ExaDat.ExaCod); ExaCod);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -811,14 +761,15 @@ void Exa_CreateListDatesOfExamAnnouncements (void)
if (Gbl.DB.DatabaseIsOpen) if (Gbl.DB.DatabaseIsOpen)
{ {
/***** Get exam dates (no matter in what order) /***** Get exam dates (ordered from more recent to older)
of visible exam announcements of visible exam announcements
in current course from database *****/ in current course from database *****/
NumExaAnns = DB_QuerySELECT (&mysql_res,"can not get exam announcements" NumExaAnns = DB_QuerySELECT (&mysql_res,"can not get exam announcements"
" in this course", " in this course",
"SELECT DISTINCT(DATE(ExamDate))" "SELECT ExaCod,DATE(ExamDate)"
" FROM exam_announcements" " FROM exam_announcements"
" WHERE CrsCod=%ld AND Status=%u", " WHERE CrsCod=%ld AND Status=%u"
" ORDER BY ExamDate DESC",
Gbl.CurrentCrs.Crs.CrsCod, Gbl.CurrentCrs.Crs.CrsCod,
(unsigned) Exa_VISIBLE_EXAM_ANNOUNCEMENT); (unsigned) Exa_VISIBLE_EXAM_ANNOUNCEMENT);
@ -828,7 +779,7 @@ void Exa_CreateListDatesOfExamAnnouncements (void)
if (NumExaAnns) if (NumExaAnns)
{ {
/***** Allocate memory for the list *****/ /***** Allocate memory for the list *****/
if ((Gbl.ExamAnns.Lst = (struct Date *) calloc (NumExaAnns,sizeof (struct Date))) == NULL) if ((Gbl.ExamAnns.Lst = (struct Exa_ExamCodeAndDate *) calloc (NumExaAnns,sizeof (struct Exa_ExamCodeAndDate))) == NULL)
Lay_NotEnoughMemoryExit (); Lay_NotEnoughMemoryExit ();
/***** Get the dates of the existing exam announcements *****/ /***** Get the dates of the existing exam announcements *****/
@ -839,11 +790,14 @@ void Exa_CreateListDatesOfExamAnnouncements (void)
/***** Get next exam announcement *****/ /***** Get next exam announcement *****/
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
/* Read the date of the exam (row[0]) */ /* Get exam code (row[0]) */
if (sscanf (row[0],"%04u-%02u-%02u", Gbl.ExamAnns.Lst[Gbl.ExamAnns.NumExaAnns].ExaCod = Str_ConvertStrCodToLongCod (row[0]);
&Gbl.ExamAnns.Lst[Gbl.ExamAnns.NumExaAnns].Year,
&Gbl.ExamAnns.Lst[Gbl.ExamAnns.NumExaAnns].Month, /* Read the date of the exam (row[1]) */
&Gbl.ExamAnns.Lst[Gbl.ExamAnns.NumExaAnns].Day) != 3) if (sscanf (row[1],"%04u-%02u-%02u",
&Gbl.ExamAnns.Lst[Gbl.ExamAnns.NumExaAnns].ExamDate.Year,
&Gbl.ExamAnns.Lst[Gbl.ExamAnns.NumExaAnns].ExamDate.Month,
&Gbl.ExamAnns.Lst[Gbl.ExamAnns.NumExaAnns].ExamDate.Day) != 3)
Lay_ShowErrorAndExit ("Wrong date of exam."); Lay_ShowErrorAndExit ("Wrong date of exam.");
/***** Increment number of elements in list *****/ /***** Increment number of elements in list *****/
@ -874,7 +828,7 @@ void Exa_FreeListExamAnnouncements (void)
/******** Read the data of an exam announcement from the database ************/ /******** Read the data of an exam announcement from the database ************/
/*****************************************************************************/ /*****************************************************************************/
static void Exa_GetDataExamAnnouncementFromDB (void) static void Exa_GetDataExamAnnouncementFromDB (long ExaCod)
{ {
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
@ -891,7 +845,7 @@ static void Exa_GetDataExamAnnouncementFromDB (void)
"CallDate,ExamDate,Duration,Place,ExamMode," "CallDate,ExamDate,Duration,Place,ExamMode,"
"Structure,DocRequired,MatRequired,MatAllowed,OtherInfo" "Structure,DocRequired,MatRequired,MatAllowed,OtherInfo"
" FROM exam_announcements WHERE ExaCod=%ld", " FROM exam_announcements WHERE ExaCod=%ld",
Gbl.ExamAnns.ExaDat.ExaCod); ExaCod);
/***** The result of the query must have one row *****/ /***** The result of the query must have one row *****/
if (NumExaAnns != 1) if (NumExaAnns != 1)
@ -927,14 +881,25 @@ static void Exa_GetDataExamAnnouncementFromDB (void)
&Gbl.ExamAnns.ExaDat.CallDate.Year, &Gbl.ExamAnns.ExaDat.CallDate.Year,
&Gbl.ExamAnns.ExaDat.CallDate.Month, &Gbl.ExamAnns.ExaDat.CallDate.Month,
&Gbl.ExamAnns.ExaDat.CallDate.Day, &Gbl.ExamAnns.ExaDat.CallDate.Day,
&Hour,&Minute,&Second) != 6) &Hour,
&Minute,
&Second) != 6)
Lay_ShowErrorAndExit ("Wrong date of exam announcement."); Lay_ShowErrorAndExit ("Wrong date of exam announcement.");
/* Date of exam (row[6]) */ /* Date of exam (row[6]) */
if (sscanf (row[6],"%04u-%02u-%02u %02u:%02u:%02u", if (sscanf (row[6],"%04u-%02u-%02u %02u:%02u:%02u",
&Gbl.ExamAnns.ExaDat.ExamDate.Year,&Gbl.ExamAnns.ExaDat.ExamDate.Month,&Gbl.ExamAnns.ExaDat.ExamDate.Day, &Gbl.ExamAnns.ExaDat.ExamDate.Year,
&Gbl.ExamAnns.ExaDat.StartTime.Hour,&Gbl.ExamAnns.ExaDat.StartTime.Minute,&Second) != 6) &Gbl.ExamAnns.ExaDat.ExamDate.Month,
&Gbl.ExamAnns.ExaDat.ExamDate.Day,
&Gbl.ExamAnns.ExaDat.StartTime.Hour,
&Gbl.ExamAnns.ExaDat.StartTime.Minute,
&Second) != 6)
Lay_ShowErrorAndExit ("Wrong date of exam."); Lay_ShowErrorAndExit ("Wrong date of exam.");
snprintf (Gbl.ExamAnns.ExaDat.ExamDate.YYYYMMDD,sizeof (Gbl.ExamAnns.ExaDat.ExamDate.YYYYMMDD),
"%04u%02u%02u",
Gbl.ExamAnns.ExaDat.ExamDate.Year,
Gbl.ExamAnns.ExaDat.ExamDate.Month,
Gbl.ExamAnns.ExaDat.ExamDate.Day);
/* Approximate duration (row[7]) */ /* Approximate duration (row[7]) */
if (sscanf (row[7],"%02u:%02u:%02u",&Gbl.ExamAnns.ExaDat.Duration.Hour,&Gbl.ExamAnns.ExaDat.Duration.Minute,&Second) != 3) if (sscanf (row[7],"%02u:%02u:%02u",&Gbl.ExamAnns.ExaDat.Duration.Hour,&Gbl.ExamAnns.ExaDat.Duration.Minute,&Second) != 3)
@ -976,7 +941,9 @@ static void Exa_GetDataExamAnnouncementFromDB (void)
/************ Show a form with the data of an exam announcement **************/ /************ Show a form with the data of an exam announcement **************/
/*****************************************************************************/ /*****************************************************************************/
static void Exa_ShowExamAnnouncement (Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement) static void Exa_ShowExamAnnouncement (long ExaCod,
Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement,
bool HighLight)
{ {
extern const char *Hlp_ASSESSMENT_Announcements_new_announcement; extern const char *Hlp_ASSESSMENT_Announcements_new_announcement;
extern const char *Hlp_ASSESSMENT_Announcements_edit_announcement; extern const char *Hlp_ASSESSMENT_Announcements_edit_announcement;
@ -1010,6 +977,10 @@ static void Exa_ShowExamAnnouncement (Exa_TypeViewExamAnnouncement_t TypeViewExa
unsigned Year; unsigned Year;
unsigned Hour; unsigned Hour;
unsigned Minute; unsigned Minute;
char *Anchor = NULL;
const char *Width;
void (*FunctionToDrawContextualIcons) (void);
const char *HelpLink;
const char *ClassExaAnnouncement[Exa_NUM_VIEWS][Exa_NUM_STATUS] = const char *ClassExaAnnouncement[Exa_NUM_VIEWS][Exa_NUM_STATUS] =
{ {
{ // Exa_NORMAL_VIEW { // Exa_NORMAL_VIEW
@ -1047,21 +1018,41 @@ static void Exa_ShowExamAnnouncement (Exa_TypeViewExamAnnouncement_t TypeViewExa
break; break;
} }
/***** Build anchor string *****/
Exa_SetAnchorStr (ExaCod,&Anchor);
/***** Start article *****/
if (TypeViewExamAnnouncement == Exa_NORMAL_VIEW)
Lay_StartArticle (Anchor);
/***** Start box *****/ /***** Start box *****/
Box_StartBox ("625px",NULL, Width = "625px";
TypeViewExamAnnouncement == Exa_NORMAL_VIEW ? Exa_PutIconsExamAnnouncement : Gbl.ExamAnns.Anchor = Anchor; // Used to put contextual icons
NULL, Gbl.ExamAnns.ExaCod = ExaCod; // Used to put contextual icons
TypeViewExamAnnouncement == Exa_FORM_VIEW ? ((Gbl.ExamAnns.ExaDat.ExaCod > 0) ? Hlp_ASSESSMENT_Announcements_edit_announcement : FunctionToDrawContextualIcons = TypeViewExamAnnouncement == Exa_NORMAL_VIEW ? Exa_PutIconsExamAnnouncement :
Hlp_ASSESSMENT_Announcements_new_announcement) : NULL;
NULL, HelpLink = TypeViewExamAnnouncement == Exa_FORM_VIEW ? ((ExaCod > 0) ? Hlp_ASSESSMENT_Announcements_edit_announcement :
Box_NOT_CLOSABLE); Hlp_ASSESSMENT_Announcements_new_announcement) :
NULL;
if (HighLight)
{
/* Show pending alerts */
Ale_ShowAlerts (Anchor);
/* Start highlighted box */
Box_StartBoxShadow (Width,NULL,FunctionToDrawContextualIcons,HelpLink);
}
else // Don't highlight
/* Start normal box */
Box_StartBox (Width,NULL,FunctionToDrawContextualIcons,HelpLink,
Box_NOT_CLOSABLE);
if (TypeViewExamAnnouncement == Exa_FORM_VIEW) if (TypeViewExamAnnouncement == Exa_FORM_VIEW)
{ {
/***** Start form *****/ /***** Start form *****/
Frm_StartForm (ActRcvExaAnn); Frm_StartFormAnchor (ActRcvExaAnn,Anchor);
if (Gbl.ExamAnns.ExaDat.ExaCod > 0) // Existing announcement of exam if (ExaCod > 0) // Existing announcement of exam
Exa_PutParamExaCodToEdit (); Exa_PutHiddenParamExaCod (ExaCod);
} }
/***** Start table *****/ /***** Start table *****/
@ -1500,14 +1491,22 @@ static void Exa_ShowExamAnnouncement (Exa_TypeViewExamAnnouncement_t TypeViewExa
/***** End table, send button and end box *****/ /***** End table, send button and end box *****/
if (TypeViewExamAnnouncement == Exa_FORM_VIEW) if (TypeViewExamAnnouncement == Exa_FORM_VIEW)
Box_EndBoxTableWithButton ((Gbl.ExamAnns.ExaDat.ExaCod > 0) ? Btn_CONFIRM_BUTTON : Box_EndBoxTableWithButton ((ExaCod > 0) ? Btn_CONFIRM_BUTTON :
Btn_CREATE_BUTTON, Btn_CREATE_BUTTON,
Txt_Publish_announcement_OF_EXAM); Txt_Publish_announcement_OF_EXAM);
else else
Box_EndBoxTable (); Box_EndBoxTable ();
/***** Show QR code *****/
if (TypeViewExamAnnouncement == Exa_PRINT_VIEW) if (TypeViewExamAnnouncement == Exa_PRINT_VIEW)
QR_ExamAnnnouncement (); QR_ExamAnnnouncement ();
/***** End article *****/
if (TypeViewExamAnnouncement == Exa_NORMAL_VIEW)
Lay_EndArticle ();
/***** Free anchor string *****/
Exa_FreeAnchorStr (Anchor);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1526,10 +1525,10 @@ static void Exa_PutIconsExamAnnouncement (void)
switch (Gbl.ExamAnns.ExaDat.Status) switch (Gbl.ExamAnns.ExaDat.Status)
{ {
case Exa_VISIBLE_EXAM_ANNOUNCEMENT: case Exa_VISIBLE_EXAM_ANNOUNCEMENT:
Ico_PutContextualIconToHide (ActHidExaAnn,Exa_PutParamExaCodToEdit); Ico_PutContextualIconToHide (ActHidExaAnn,Gbl.ExamAnns.Anchor,Exa_PutParamExaCodToEdit);
break; break;
case Exa_HIDDEN_EXAM_ANNOUNCEMENT: case Exa_HIDDEN_EXAM_ANNOUNCEMENT:
Ico_PutContextualIconToUnhide (ActShoExaAnn,Exa_PutParamExaCodToEdit); Ico_PutContextualIconToUnhide (ActShoExaAnn,Gbl.ExamAnns.Anchor,Exa_PutParamExaCodToEdit);
break; break;
case Exa_DELETED_EXAM_ANNOUNCEMENT: // Not applicable here case Exa_DELETED_EXAM_ANNOUNCEMENT: // Not applicable here
break; break;
@ -1549,7 +1548,7 @@ static void Exa_PutIconsExamAnnouncement (void)
static void Exa_PutParamExaCodToEdit (void) static void Exa_PutParamExaCodToEdit (void)
{ {
Exa_PutHiddenParamExaCod (Gbl.ExamAnns.ExaDat.ExaCod); Exa_PutHiddenParamExaCod (Gbl.ExamAnns.ExaCod);
} }
void Exa_PutHiddenParamExaCod (long ExaCod) void Exa_PutHiddenParamExaCod (long ExaCod)
@ -1567,6 +1566,40 @@ static long Exa_GetParamExaCod (void)
return Par_GetParToLong ("ExaCod"); return Par_GetParToLong ("ExaCod");
} }
/*****************************************************************************/
/*********** Build/free anchor string for an announcement of exam ************/
/*****************************************************************************/
void Exa_SetAnchorStr (long ExaCod,char **Anchor)
{
if (ExaCod > 0)
{
if (ExaCod == Gbl.ExamAnns.NewExaCod) // New announcement of exam
{
if (asprintf (Anchor,"exam_new") < 0)
Lay_NotEnoughMemoryExit ();
}
else // Existing announcement of exam, not a new one
{
// Existing announcement of exam, not new
if (asprintf (Anchor,"exam_%ld",
ExaCod) < 0)
Lay_NotEnoughMemoryExit ();
}
}
else // ?
*Anchor = NULL;
}
void Exa_FreeAnchorStr (char *Anchor)
{
if (Anchor)
{
free ((void *) Anchor);
Anchor = NULL;
}
}
/*****************************************************************************/ /*****************************************************************************/
/************ Get summary and content about an exam announcement *************/ /************ Get summary and content about an exam announcement *************/
/*****************************************************************************/ /*****************************************************************************/
@ -1580,14 +1613,13 @@ void Exa_GetSummaryAndContentExamAnnouncement (char SummaryStr[Ntf_MAX_BYTES_SUM
char StrExamDate[Cns_MAX_BYTES_DATE + 1]; char StrExamDate[Cns_MAX_BYTES_DATE + 1];
/***** Initializations *****/ /***** Initializations *****/
Gbl.ExamAnns.ExaDat.ExaCod = ExaCod;
SummaryStr[0] = '\0'; // Return nothing on error SummaryStr[0] = '\0'; // Return nothing on error
/***** Allocate memory for the exam announcement *****/ /***** Allocate memory for the exam announcement *****/
Exa_AllocMemExamAnnouncement (); Exa_AllocMemExamAnnouncement ();
/***** Get data of an exam announcement from database *****/ /***** Get data of an exam announcement from database *****/
Exa_GetDataExamAnnouncementFromDB (); Exa_GetDataExamAnnouncementFromDB (ExaCod);
/***** Content *****/ /***** Content *****/
if (GetContent) if (GetContent)

View File

@ -59,7 +59,6 @@ typedef enum
struct ExamData struct ExamData
{ {
long ExaCod;
long CrsCod; long CrsCod;
Exa_ExamAnnouncementStatus_t Status; Exa_ExamAnnouncementStatus_t Status;
char CrsFullName[Hie_MAX_BYTES_FULL_NAME + 1]; char CrsFullName[Hie_MAX_BYTES_FULL_NAME + 1];
@ -78,6 +77,12 @@ struct ExamData
char *OtherInfo; char *OtherInfo;
}; };
struct Exa_ExamCodeAndDate
{
long ExaCod;
struct Date ExamDate;
};
/*****************************************************************************/ /*****************************************************************************/
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
@ -89,20 +94,23 @@ void Exa_PrintExamAnnouncement (void);
void Exa_ReqRemoveExamAnnouncement (void); void Exa_ReqRemoveExamAnnouncement (void);
void Exa_RemoveExamAnnouncement1 (void); void Exa_RemoveExamAnnouncement1 (void);
void Exa_RemoveExamAnnouncement2 (void); void Exa_RemoveExamAnnouncement2 (void);
void Exa_HideExamAnnouncement1 (void); void Exa_HideExamAnnouncement (void);
void Exa_HideExamAnnouncement2 (void); void Exa_UnhideExamAnnouncement (void);
void Exa_UnhideExamAnnouncement1 (void);
void Exa_UnhideExamAnnouncement2 (void);
void Exa_FreeMemExamAnnouncement (void); void Exa_FreeMemExamAnnouncement (void);
void Exa_FreeListExamAnnouncements (void); void Exa_FreeListExamAnnouncements (void);
void Exa_ListExamAnnouncementsSee (void); void Exa_ListExamAnnouncementsSee (void);
void Exa_ListExamAnnouncementsEdit (void);
void Exa_GetExaCodToHighlight (void); void Exa_GetExaCodToHighlight (void);
void Exa_GetDateToHighlight (void); void Exa_GetDateToHighlight (void);
void Exa_CreateListDatesOfExamAnnouncements (void); void Exa_CreateListDatesOfExamAnnouncements (void);
void Exa_PutHiddenParamExaCod (long ExaCod); void Exa_PutHiddenParamExaCod (long ExaCod);
void Exa_SetAnchorStr (long ExaCod,char **Anchor);
void Exa_FreeAnchorStr (char *Anchor);
void Exa_GetSummaryAndContentExamAnnouncement (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], void Exa_GetSummaryAndContentExamAnnouncement (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
char **ContentStr, char **ContentStr,
long ExaCod,bool GetContent); long ExaCod,bool GetContent);

View File

@ -827,9 +827,9 @@ static void Gam_PutFormsToRemEditOneGame (long GamCod,bool Visible,
/***** Put icon to hide/show game *****/ /***** Put icon to hide/show game *****/
if (Visible) if (Visible)
Ico_PutContextualIconToHide (ActHidGam,Gam_PutParams); Ico_PutContextualIconToHide (ActHidGam,NULL,Gam_PutParams);
else else
Ico_PutContextualIconToUnhide (ActShoGam,Gam_PutParams); Ico_PutContextualIconToUnhide (ActShoGam,NULL,Gam_PutParams);
/***** Put icon to edit game *****/ /***** Put icon to edit game *****/
Ico_PutContextualIconToEdit (ActEdiOneGam,Gam_PutParams); Ico_PutContextualIconToEdit (ActEdiOneGam,Gam_PutParams);

View File

@ -204,6 +204,7 @@ void Gbl_InitializeGlobals (void)
Gbl.ExamAnns.NumExaAnns = 0; Gbl.ExamAnns.NumExaAnns = 0;
Gbl.ExamAnns.Lst = NULL; Gbl.ExamAnns.Lst = NULL;
Gbl.ExamAnns.NewExaCod = -1L;
Gbl.ExamAnns.HighlightExaCod = -1L; Gbl.ExamAnns.HighlightExaCod = -1L;
Gbl.ExamAnns.HighlightDate[0] = '\0'; // No exam announcements highlighted Gbl.ExamAnns.HighlightDate[0] = '\0'; // No exam announcements highlighted

View File

@ -107,12 +107,12 @@ struct Globals
} Form; } Form;
struct struct
{ {
unsigned Num; // Number of alert size_t Num; // Number of alert
struct struct
{ {
Ale_AlertType_t Type; Ale_AlertType_t Type;
char *Text; char *Text; // Message to be displayed
const char *Section; // Where to display the alert char *Section; // Where to display the alert
} List[Ale_MAX_ALERTS]; } List[Ale_MAX_ALERTS];
} Alerts; // Alert message created in a function and printed in a subsequent function. } Alerts; // Alert message created in a function and printed in a subsequent function.
struct struct
@ -519,12 +519,14 @@ struct Globals
} Syllabus; } Syllabus;
struct struct
{ {
struct Date *Lst; // List of dates of exam announcements struct Exa_ExamCodeAndDate *Lst; // List of exam announcements
unsigned NumExaAnns; // Number of announcements of exam in the list unsigned NumExaAnns; // Number of announcements of exam in the list
long NewExaCod; // New exam announcement just created
long HighlightExaCod; // Exam announcement to be highlighted long HighlightExaCod; // Exam announcement to be highlighted
char HighlightDate[4 + 1 + 2 + 1 + 2 + 1]; // Date with exam announcements to be highlighted (in YYYY-MM-DD format) char HighlightDate[4 + 2 + 2 + 1]; // Date with exam announcements to be highlighted (in YYYYMMDD format)
long ExaCod; // Used to put contextual icons
const char *Anchor; // Used to put contextual icons
struct ExamData ExaDat; struct ExamData ExaDat;
bool NewExamAnnouncement;
} ExamAnns; } ExamAnns;
struct struct
{ {

View File

@ -261,20 +261,20 @@ void Ico_PutContextualIconToView (Act_Action_t NextAction,void (*FuncParams) ())
Txt_View); Txt_View);
} }
void Ico_PutContextualIconToHide (Act_Action_t NextAction,void (*FuncParams) ()) void Ico_PutContextualIconToHide (Act_Action_t NextAction,const char *Anchor,void (*FuncParams) ())
{ {
extern const char *Txt_Hide; extern const char *Txt_Hide;
Lay_PutContextualLinkOnlyIcon (NextAction,NULL,FuncParams, Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,FuncParams,
"eye.svg", "eye.svg",
Txt_Hide); Txt_Hide);
} }
void Ico_PutContextualIconToUnhide (Act_Action_t NextAction,void (*FuncParams) ()) void Ico_PutContextualIconToUnhide (Act_Action_t NextAction,const char *Anchor,void (*FuncParams) ())
{ {
extern const char *Txt_Show; extern const char *Txt_Show;
Lay_PutContextualLinkOnlyIcon (NextAction,NULL,FuncParams, Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,FuncParams,
"eye-slash.svg", "eye-slash.svg",
Txt_Show); Txt_Show);
} }

View File

@ -62,8 +62,8 @@ void Ico_PutContextualIconToRemove (Act_Action_t NextAction,void (*FuncParams) (
void Ico_PutContextualIconToEdit (Act_Action_t NextAction,void (*FuncParams) ()); void Ico_PutContextualIconToEdit (Act_Action_t NextAction,void (*FuncParams) ());
void Ico_PutContextualIconToViewFiles (Act_Action_t NextAction,void (*FuncParams) ()); void Ico_PutContextualIconToViewFiles (Act_Action_t NextAction,void (*FuncParams) ());
void Ico_PutContextualIconToView (Act_Action_t NextAction,void (*FuncParams) ()); void Ico_PutContextualIconToView (Act_Action_t NextAction,void (*FuncParams) ());
void Ico_PutContextualIconToUnhide (Act_Action_t NextAction,void (*FuncParams) ()); void Ico_PutContextualIconToUnhide (Act_Action_t NextAction,const char *Anchor,void (*FuncParams) ());
void Ico_PutContextualIconToHide (Act_Action_t NextAction,void (*FuncParams) ()); void Ico_PutContextualIconToHide (Act_Action_t NextAction,const char *Anchor,void (*FuncParams) ());
void Ico_PutContextualIconToPrint (Act_Action_t NextAction,void (*FuncParams) ()); void Ico_PutContextualIconToPrint (Act_Action_t NextAction,void (*FuncParams) ());
void Ico_PutDivIcon (const char *DivClass,const char *Icon,const char *Title); void Ico_PutDivIcon (const char *DivClass,const char *Icon,const char *Title);

View File

@ -537,10 +537,11 @@ static void Lay_WriteScripts (void)
for (NumExamAnnouncement = 0; for (NumExamAnnouncement = 0;
NumExamAnnouncement < Gbl.ExamAnns.NumExaAnns; NumExamAnnouncement < Gbl.ExamAnns.NumExaAnns;
NumExamAnnouncement++) NumExamAnnouncement++)
fprintf (Gbl.F.Out," LstExamAnnouncements.push({ Year: %u, Month: %u, Day: %u });\n", fprintf (Gbl.F.Out," LstExamAnnouncements.push({ ExaCod: %ld, Year: %u, Month: %u, Day: %u });\n",
Gbl.ExamAnns.Lst[NumExamAnnouncement].Year, Gbl.ExamAnns.Lst[NumExamAnnouncement].ExaCod,
Gbl.ExamAnns.Lst[NumExamAnnouncement].Month, Gbl.ExamAnns.Lst[NumExamAnnouncement].ExamDate.Year,
Gbl.ExamAnns.Lst[NumExamAnnouncement].Day); Gbl.ExamAnns.Lst[NumExamAnnouncement].ExamDate.Month,
Gbl.ExamAnns.Lst[NumExamAnnouncement].ExamDate.Day);
fprintf (Gbl.F.Out,"</script>\n"); fprintf (Gbl.F.Out,"</script>\n");

View File

@ -25,8 +25,10 @@
/********************************* Headers ***********************************/ /********************************* Headers ***********************************/
/*****************************************************************************/ /*****************************************************************************/
#define _GNU_SOURCE // For asprintf
#include <linux/limits.h> // For PATH_MAX #include <linux/limits.h> // For PATH_MAX
#include <linux/stddef.h> // For NULL #include <linux/stddef.h> // For NULL
#include <stdio.h> // For sscanf, asprintf, etc.
#include <stdlib.h> // For exit, system, malloc, calloc, free, etc. #include <stdlib.h> // For exit, system, malloc, calloc, free, etc.
#include <string.h> #include <string.h>
@ -640,11 +642,10 @@ static void Not_DrawANotice (Not_Listing_t TypeNoticesListing,
}; };
static unsigned UniqueId = 0; static unsigned UniqueId = 0;
struct UsrData UsrDat; struct UsrData UsrDat;
char Anchor[16 + 10 + 1]; char *Anchor = NULL;
/***** Build anchor string *****/ /***** Build anchor string *****/
snprintf (Anchor,sizeof (Anchor), Not_SetAnchorStr (NotCod,&Anchor);
"NOT_%ld",NotCod);
/***** Start article for this notice *****/ /***** Start article for this notice *****/
if (TypeNoticesListing == Not_LIST_FULL_NOTICES) if (TypeNoticesListing == Not_LIST_FULL_NOTICES)
@ -778,6 +779,34 @@ static void Not_DrawANotice (Not_Listing_t TypeNoticesListing,
fprintf (Gbl.F.Out,"</div>"); fprintf (Gbl.F.Out,"</div>");
Lay_EndArticle (); Lay_EndArticle ();
} }
/***** Free anchor string *****/
Not_FreeAnchorStr (Anchor);
}
/*****************************************************************************/
/****************** Build/free anchor string for a notice ********************/
/*****************************************************************************/
void Not_SetAnchorStr (long NotCod,char **Anchor)
{
if (NotCod > 0) // Existing announcement of exam, not a new one
{
if (asprintf (Anchor,"not_%ld",
NotCod) < 0)
Lay_NotEnoughMemoryExit ();
}
else // ?
*Anchor = NULL;
}
void Not_FreeAnchorStr (char *Anchor)
{
if (Anchor)
{
free ((void *) Anchor);
Anchor = NULL;
}
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -68,6 +68,10 @@ void Not_RequestRemNotice (void);
void Not_RemoveNotice (void); void Not_RemoveNotice (void);
void Not_ShowNotices (Not_Listing_t TypeNoticesListing,long HighlightNotCod); void Not_ShowNotices (Not_Listing_t TypeNoticesListing,long HighlightNotCod);
void Not_SetAnchorStr (long NotCod,char **Anchor);
void Not_FreeAnchorStr (char *Anchor);
void Not_GetSummaryAndContentNotice (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], void Not_GetSummaryAndContentNotice (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
char **ContentStr, char **ContentStr,
long NotCod,bool GetContent); long NotCod,bool GetContent);

View File

@ -2185,10 +2185,10 @@ static void Prj_PutFormsToRemEditOnePrj (long PrjCod,Prj_HiddenVisibl_t Hidden,
switch (Hidden) switch (Hidden)
{ {
case Prj_HIDDEN: case Prj_HIDDEN:
Ico_PutContextualIconToUnhide (ActShoPrj,Prj_PutCurrentParams); Ico_PutContextualIconToUnhide (ActShoPrj,NULL,Prj_PutCurrentParams);
break; break;
case Prj_VISIBL: case Prj_VISIBL:
Ico_PutContextualIconToHide (ActHidPrj,Prj_PutCurrentParams); Ico_PutContextualIconToHide (ActHidPrj,NULL,Prj_PutCurrentParams);
break; break;
} }

View File

@ -814,9 +814,9 @@ static void Svy_PutFormsToRemEditOneSvy (long SvyCod,bool Visible)
/***** Put form to hide/show survey *****/ /***** Put form to hide/show survey *****/
if (Visible) if (Visible)
Ico_PutContextualIconToHide (ActHidSvy,Svy_PutParams); Ico_PutContextualIconToHide (ActHidSvy,NULL,Svy_PutParams);
else else
Ico_PutContextualIconToUnhide (ActShoSvy,Svy_PutParams); Ico_PutContextualIconToUnhide (ActShoSvy,NULL,Svy_PutParams);
/***** Put form to edit survey *****/ /***** Put form to edit survey *****/
Ico_PutContextualIconToEdit (ActEdiOneSvy,Svy_PutParams); Ico_PutContextualIconToEdit (ActEdiOneSvy,Svy_PutParams);

View File

@ -1211,27 +1211,6 @@ const char *Txt_all =
"tudo"; "tudo";
#endif #endif
const char *Txt_All_announcements_of_exams =
#if L==1 // ca
"Totes les convocat&ograve;ries d'ex&agrave;mens";
#elif L==2 // de
"Alle Aufrufe f&uuml;r Pr&uuml;fung";
#elif L==3 // en
"All announcements of exams";
#elif L==4 // es
"Todas las convocatorias de ex&aacute;menes";
#elif L==5 // fr
"Tous les convocations &agrave; examens";
#elif L==6 // gn
"Todas las convocatorias de ex&aacute;menes"; // Okoteve traducción
#elif L==7 // it
"Tutti i appelli d'esame";
#elif L==8 // pl
"Wszystkie ogloszenia egzamin&oacute;w";
#elif L==9 // pt
"Todas as chamadas para exames";
#endif
const char *Txt_all_degrees = const char *Txt_all_degrees =
#if L==1 // ca #if L==1 // ca
"Totes les titulacions"; "Totes les titulacions";

View File

@ -1879,6 +1879,7 @@ static void TL_PutFormGoToAction (const struct TL_Note *SocNot)
extern const char *Txt_TIMELINE_NOTE[TL_NUM_NOTE_TYPES]; extern const char *Txt_TIMELINE_NOTE[TL_NUM_NOTE_TYPES];
extern const char *Txt_not_available; extern const char *Txt_not_available;
char Class[64]; char Class[64];
char *Anchor = NULL;
const Act_Action_t TL_DefaultActions[TL_NUM_NOTE_TYPES] = const Act_Action_t TL_DefaultActions[TL_NUM_NOTE_TYPES] =
{ {
ActUnk, // TL_NOTE_UNKNOWN ActUnk, // TL_NOTE_UNKNOWN
@ -2001,7 +2002,10 @@ static void TL_PutFormGoToAction (const struct TL_Note *SocNot)
Crs_PutParamCrsCod (SocNot->HieCod); // Go to another course Crs_PutParamCrsCod (SocNot->HieCod); // Go to another course
break; break;
case TL_NOTE_EXAM_ANNOUNCEMENT: case TL_NOTE_EXAM_ANNOUNCEMENT:
Frm_StartFormUnique (TL_DefaultActions[SocNot->NoteType]); Exa_SetAnchorStr (SocNot->Cod,&Anchor);
Frm_StartFormUniqueAnchor (TL_DefaultActions[SocNot->NoteType],
Anchor); // Locate on this specific exam
Exa_FreeAnchorStr (Anchor);
Exa_PutHiddenParamExaCod (SocNot->Cod); Exa_PutHiddenParamExaCod (SocNot->Cod);
if (SocNot->HieCod != Gbl.CurrentCrs.Crs.CrsCod) // Not the current course if (SocNot->HieCod != Gbl.CurrentCrs.Crs.CrsCod) // Not the current course
Crs_PutParamCrsCod (SocNot->HieCod); // Go to another course Crs_PutParamCrsCod (SocNot->HieCod); // Go to another course
@ -2021,7 +2025,10 @@ static void TL_PutFormGoToAction (const struct TL_Note *SocNot)
Crs_PutParamCrsCod (SocNot->HieCod); // Go to another course Crs_PutParamCrsCod (SocNot->HieCod); // Go to another course
break; break;
case TL_NOTE_NOTICE: case TL_NOTE_NOTICE:
Frm_StartFormUnique (TL_DefaultActions[SocNot->NoteType]); Not_SetAnchorStr (SocNot->Cod,&Anchor);
Frm_StartFormUniqueAnchor (TL_DefaultActions[SocNot->NoteType],
Anchor);
Not_FreeAnchorStr (Anchor);
Not_PutHiddenParamNotCod (SocNot->Cod); Not_PutHiddenParamNotCod (SocNot->Cod);
if (SocNot->HieCod != Gbl.CurrentCrs.Crs.CrsCod) // Not the current course if (SocNot->HieCod != Gbl.CurrentCrs.Crs.CrsCod) // Not the current course
Crs_PutParamCrsCod (SocNot->HieCod); // Go to another course Crs_PutParamCrsCod (SocNot->HieCod); // Go to another course