Version 23.75: Apr 13, 2024 Code refactoring related to closed/open.

This commit is contained in:
acanas 2024-04-13 21:33:16 +02:00
parent c9a75eb0ad
commit b785e884ba
32 changed files with 405 additions and 473 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 826 B

View File

@ -2351,8 +2351,8 @@ int swad__getAttendanceEvents (struct soap *soap,
getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].startTime = (int) Event.TimeUTC[Dat_STR_TIME]; getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].startTime = (int) Event.TimeUTC[Dat_STR_TIME];
getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].endTime = (int) Event.TimeUTC[Dat_END_TIME]; getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].endTime = (int) Event.TimeUTC[Dat_END_TIME];
getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].commentsTeachersVisible = Event.Open == CloOpe_OPEN ? 1 : getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].commentsTeachersVisible = (Event.ClosedOrOpen == CloOpe_OPEN) ? 1 :
0; 0;
Length = strlen (Event.Title); Length = strlen (Event.Title);
getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].title = getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].title =
soap_malloc (soap,Length + 1); soap_malloc (soap,Length + 1);

View File

@ -471,11 +471,10 @@ static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
Asg_OneOrMultiple_t OneOrMultiple, Asg_OneOrMultiple_t OneOrMultiple,
Vie_ViewType_t ViewType) Vie_ViewType_t ViewType)
{ {
extern const char *Txt_Actions[ActLst_NUM_ACTIONS]; extern const char *CloOpe_Class[CloOpe_NUM_CLOSED_OPEN][HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_DateGreenClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_DateRedClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_TitleClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_TitleClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_DataClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_DataClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *Txt_Actions[ActLst_NUM_ACTIONS];
char *Anchor = NULL; char *Anchor = NULL;
static unsigned UniqueId = 0; static unsigned UniqueId = 0;
char *Id; char *Id;
@ -511,16 +510,14 @@ static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
case Vie_VIEW: case Vie_VIEW:
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"", HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
Id, Id,
Assignments->Asg.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Assignments->Asg.HiddenOrVisible] : CloOpe_Class[Assignments->Asg.ClosedOrOpen][Assignments->Asg.HiddenOrVisible],
HidVis_DateRedClass[Assignments->Asg.HiddenOrVisible],
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
break; break;
case Vie_PRINT: case Vie_PRINT:
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"", HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"",
Id, Id,
Assignments->Asg.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Assignments->Asg.HiddenOrVisible] : CloOpe_Class[Assignments->Asg.ClosedOrOpen][Assignments->Asg.HiddenOrVisible],
HidVis_DateRedClass[Assignments->Asg.HiddenOrVisible],
The_GetSuffix ()); The_GetSuffix ());
break; break;
default: default:
@ -659,7 +656,7 @@ static void Asg_WriteAssignmentFolder (struct Asg_Assignment *Asg,
extern const char *Txt_Folder; extern const char *Txt_Folder;
Act_Action_t NextAction; Act_Action_t NextAction;
bool ICanSendFiles = Asg->HiddenOrVisible == HidVis_VISIBLE && // It's visible (not hidden) bool ICanSendFiles = Asg->HiddenOrVisible == HidVis_VISIBLE && // It's visible (not hidden)
Asg->Open == CloOpe_OPEN && // It's open (inside dates) Asg->ClosedOrOpen == CloOpe_OPEN && // It's open (inside dates)
Asg->IBelongToCrsOrGrps; // I belong to course or groups Asg->IBelongToCrsOrGrps; // I belong to course or groups
/***** Folder icon *****/ /***** Folder icon *****/
@ -933,8 +930,7 @@ static void Asg_GetAssignmentDataFromRow (MYSQL_RES **mysql_res,
Asg->TimeUTC[Dat_END_TIME] = Dat_GetUNIXTimeFromStr (row[4]); Asg->TimeUTC[Dat_END_TIME] = Dat_GetUNIXTimeFromStr (row[4]);
/* Get whether the assignment is open or closed (row(5)) */ /* Get whether the assignment is open or closed (row(5)) */
Asg->Open = (row[5][0] == '1') ? CloOpe_OPEN : Asg->ClosedOrOpen = CloOpe_GetClosedOrOpenFrom01 (row[5][0]);
CloOpe_CLOSED;
/* Get the title (row[6]) and the folder (row[7]) of the assignment */ /* Get the title (row[6]) and the folder (row[7]) of the assignment */
Str_Copy (Asg->Title ,row[6],sizeof (Asg->Title ) - 1); Str_Copy (Asg->Title ,row[6],sizeof (Asg->Title ) - 1);
@ -962,7 +958,7 @@ static void Asg_ResetAssignment (struct Asg_Assignment *Asg)
Asg->UsrCod = -1L; Asg->UsrCod = -1L;
Asg->TimeUTC[Dat_STR_TIME] = Asg->TimeUTC[Dat_STR_TIME] =
Asg->TimeUTC[Dat_END_TIME] = (time_t) 0; Asg->TimeUTC[Dat_END_TIME] = (time_t) 0;
Asg->Open = CloOpe_CLOSED; Asg->ClosedOrOpen = CloOpe_CLOSED;
Asg->Title[0] = '\0'; Asg->Title[0] = '\0';
Asg->SendWork = Asg_DO_NOT_SEND_WORK; Asg->SendWork = Asg_DO_NOT_SEND_WORK;
Asg->Folder[0] = '\0'; Asg->Folder[0] = '\0';
@ -1185,7 +1181,7 @@ void Asg_ReqCreatOrEditAsg (void)
Assignments.Asg.AsgCod = -1L; Assignments.Asg.AsgCod = -1L;
Assignments.Asg.TimeUTC[Dat_STR_TIME] = Dat_GetStartExecutionTimeUTC (); Assignments.Asg.TimeUTC[Dat_STR_TIME] = Dat_GetStartExecutionTimeUTC ();
Assignments.Asg.TimeUTC[Dat_END_TIME] = Assignments.Asg.TimeUTC[Dat_STR_TIME] + (2 * 60 * 60); // +2 hours Assignments.Asg.TimeUTC[Dat_END_TIME] = Assignments.Asg.TimeUTC[Dat_STR_TIME] + (2 * 60 * 60); // +2 hours
Assignments.Asg.Open = CloOpe_OPEN; Assignments.Asg.ClosedOrOpen = CloOpe_OPEN;
Assignments.Asg.Title[0] = '\0'; Assignments.Asg.Title[0] = '\0';
Assignments.Asg.SendWork = Asg_DO_NOT_SEND_WORK; Assignments.Asg.SendWork = Asg_DO_NOT_SEND_WORK;
Assignments.Asg.Folder[0] = '\0'; Assignments.Asg.Folder[0] = '\0';
@ -1657,15 +1653,18 @@ static bool Asg_CheckIfIBelongToCrsOrGrpsThisAssignment (long AsgCod)
void Asg_WriteDatesAssignment (const struct Asg_Assignment *Asg) void Asg_WriteDatesAssignment (const struct Asg_Assignment *Asg)
{ {
extern const char *Txt_unknown_assignment; extern const char *Txt_unknown_assignment;
static const char *DateClass[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = "ASG_LST_DATE_RED",
[CloOpe_OPEN ] = "ASG_LST_DATE_GREEN",
};
static unsigned UniqueId = 0; static unsigned UniqueId = 0;
char *Id; char *Id;
/***** Begin table cell *****/ /***** Begin table cell *****/
HTM_TD_Begin ("colspan=\"2\" class=\"RM %s_%s %s\"", HTM_TD_Begin ("colspan=\"2\" class=\"RM %s_%s %s\"",
Asg->Open == CloOpe_OPEN ? "ASG_LST_DATE_GREEN" : DateClass[Asg->ClosedOrOpen],The_GetSuffix (),
"ASG_LST_DATE_RED", The_GetColorRows ());
The_GetSuffix (),
The_GetColorRows ());
if (Asg->AsgCod > 0) if (Asg->AsgCod > 0)
{ {
@ -1707,6 +1706,12 @@ void Asg_WriteDatesAssignment (const struct Asg_Assignment *Asg)
Usr_ICan_t Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg) Usr_ICan_t Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg)
{ {
static Usr_ICan_t CloOpe_ICanCreate[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = Usr_I_CAN_NOT,
[CloOpe_OPEN ] = Usr_I_CAN,
};
/***** Trivial check 1: assignment is valid *****/ /***** Trivial check 1: assignment is valid *****/
if (Asg->AsgCod <= 0) if (Asg->AsgCod <= 0)
return Usr_I_CAN_NOT; return Usr_I_CAN_NOT;
@ -1723,13 +1728,12 @@ Usr_ICan_t Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg)
/***** Check 4: Depending on my role in this course... *****/ /***** Check 4: Depending on my role in this course... *****/
switch (Gbl.Usrs.Me.UsrDat.Roles.InCurrentCrs) switch (Gbl.Usrs.Me.UsrDat.Roles.InCurrentCrs)
{ {
case Rol_STD: // Students... case Rol_STD: // Students...
case Rol_NET: // ...and non-editing teachers... case Rol_NET: // ...and non-editing teachers...
// ...can create inside open assignments // ...can create only inside open assignments
return (Asg->Open == CloOpe_OPEN) ? Usr_I_CAN : return CloOpe_ICanCreate[Asg->ClosedOrOpen];
Usr_I_CAN_NOT; case Rol_TCH: // Teachers...
case Rol_TCH: // Teachers... return Usr_I_CAN; // ...can create inside any assignment
return Usr_I_CAN; // ...can create inside open or closed assignments
default: default:
return Usr_I_CAN_NOT; return Usr_I_CAN_NOT;
} }

View File

@ -52,7 +52,7 @@ struct Asg_Assignment
HidVis_HiddenOrVisible_t HiddenOrVisible; HidVis_HiddenOrVisible_t HiddenOrVisible;
long UsrCod; long UsrCod;
time_t TimeUTC[Dat_NUM_START_END_TIME]; time_t TimeUTC[Dat_NUM_START_END_TIME];
CloOpe_ClosedOrOpen_t Open; CloOpe_ClosedOrOpen_t ClosedOrOpen;
char Title[Asg_MAX_BYTES_ASSIGNMENT_TITLE + 1]; char Title[Asg_MAX_BYTES_ASSIGNMENT_TITLE + 1];
Asg_SendWork_t SendWork; Asg_SendWork_t SendWork;
char Folder[Brw_MAX_BYTES_FOLDER + 1]; char Folder[Brw_MAX_BYTES_FOLDER + 1];

View File

@ -430,11 +430,10 @@ static void Att_PutParsToListUsrsAttendance (void *Events)
static void Att_ShowOneEventRow (struct Att_Events *Events, static void Att_ShowOneEventRow (struct Att_Events *Events,
bool ShowOnlyThisAttEventComplete) bool ShowOnlyThisAttEventComplete)
{ {
extern const char *Txt_View_event; extern const char *CloOpe_Class[CloOpe_NUM_CLOSED_OPEN][HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_DateGreenClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_DateRedClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_TitleClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_TitleClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_DataClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_DataClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *Txt_View_event;
char *Anchor = NULL; char *Anchor = NULL;
static unsigned UniqueId = 0; static unsigned UniqueId = 0;
char *Id; char *Id;
@ -467,16 +466,13 @@ static void Att_ShowOneEventRow (struct Att_Events *Events,
if (ShowOnlyThisAttEventComplete) if (ShowOnlyThisAttEventComplete)
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"", HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"",
Id, Id,
Events->Event.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Events->Event.HiddenOrVisible] : CloOpe_Class[Events->Event.ClosedOrOpen][Events->Event.HiddenOrVisible],
HidVis_DateRedClass[Events->Event.HiddenOrVisible],
The_GetSuffix ()); The_GetSuffix ());
else else
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"", HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
Id, Id,
Events->Event.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Events->Event.HiddenOrVisible] : CloOpe_Class[Events->Event.ClosedOrOpen][Events->Event.HiddenOrVisible],
HidVis_DateRedClass[Events->Event.HiddenOrVisible], The_GetSuffix (),The_GetColorRows ());
The_GetSuffix (),
The_GetColorRows ());
Dat_WriteLocalDateHMSFromUTC (Id,Events->Event.TimeUTC[StartEndTime], Dat_WriteLocalDateHMSFromUTC (Id,Events->Event.TimeUTC[StartEndTime],
Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK, Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK,
true,true,true,0x7); true,true,true,0x7);
@ -746,7 +742,7 @@ static void Att_ResetEvent (struct Att_Event *Event)
Event->UsrCod = -1L; Event->UsrCod = -1L;
Event->TimeUTC[Dat_STR_TIME] = Event->TimeUTC[Dat_STR_TIME] =
Event->TimeUTC[Dat_END_TIME] = (time_t) 0; Event->TimeUTC[Dat_END_TIME] = (time_t) 0;
Event->Open = CloOpe_CLOSED; Event->ClosedOrOpen = CloOpe_CLOSED;
Event->CommentTchVisible = false; Event->CommentTchVisible = false;
Event->Title[0] = '\0'; Event->Title[0] = '\0';
} }
@ -772,8 +768,7 @@ void Att_GetEventDataFromRow (MYSQL_ROW row,struct Att_Event *Event)
Event->TimeUTC[Dat_END_TIME] = Dat_GetUNIXTimeFromStr (row[5]); Event->TimeUTC[Dat_END_TIME] = Dat_GetUNIXTimeFromStr (row[5]);
/***** Get whether the attendance event is open or closed (row(6)) *****/ /***** Get whether the attendance event is open or closed (row(6)) *****/
Event->Open = (row[6][0] == '1') ? CloOpe_OPEN : Event->ClosedOrOpen = CloOpe_GetClosedOrOpenFrom01 (row[6][0]);
CloOpe_CLOSED;
/***** Get whether the attendance event is visible or not (row[7]) *****/ /***** Get whether the attendance event is visible or not (row[7]) *****/
Event->CommentTchVisible = (row[7][0] == 'Y'); Event->CommentTchVisible = (row[7][0] == 'Y');
@ -953,7 +948,7 @@ void Att_ReqCreatOrEditEvent (void)
Events.Event.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod; Events.Event.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod;
Events.Event.TimeUTC[Dat_STR_TIME] = Dat_GetStartExecutionTimeUTC (); Events.Event.TimeUTC[Dat_STR_TIME] = Dat_GetStartExecutionTimeUTC ();
Events.Event.TimeUTC[Dat_END_TIME] = Events.Event.TimeUTC[Dat_STR_TIME] + (2 * 60 * 60); // +2 hours Events.Event.TimeUTC[Dat_END_TIME] = Events.Event.TimeUTC[Dat_STR_TIME] + (2 * 60 * 60); // +2 hours
Events.Event.Open = CloOpe_OPEN; Events.Event.ClosedOrOpen = CloOpe_OPEN;
} }
else else
{ {
@ -1487,7 +1482,7 @@ static void Att_ListEventOnlyMeAsStudent (struct Att_Event *Event)
Hlp_USERS_Attendance,Box_NOT_CLOSABLE); Hlp_USERS_Attendance,Box_NOT_CLOSABLE);
/***** Begin form *****/ /***** Begin form *****/
if (Event->Open == CloOpe_OPEN) if (Event->ClosedOrOpen == CloOpe_OPEN)
{ {
Frm_BeginForm (ActRecAttMe); Frm_BeginForm (ActRecAttMe);
ParCod_PutPar (ParCod_Att,Event->AttCod); ParCod_PutPar (ParCod_Att,Event->AttCod);
@ -1516,7 +1511,7 @@ static void Att_ListEventOnlyMeAsStudent (struct Att_Event *Event)
HTM_TABLE_End (); HTM_TABLE_End ();
/* Send button */ /* Send button */
if (Event->Open == CloOpe_OPEN) if (Event->ClosedOrOpen == CloOpe_OPEN)
{ {
Btn_PutConfirmButton (Txt_Save_changes); Btn_PutConfirmButton (Txt_Save_changes);
Frm_EndForm (); Frm_EndForm ();
@ -1669,8 +1664,8 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER)
Err_ShowErrorAndExit ("Wrong call."); Err_ShowErrorAndExit ("Wrong call.");
ICanChangeStdAttendance = Usr_I_CAN_NOT; ICanChangeStdAttendance = Usr_I_CAN_NOT;
ICanEditStdComment = (Event->Open == CloOpe_OPEN) ? Usr_I_CAN : // Attendance event is open ICanEditStdComment = (Event->ClosedOrOpen == CloOpe_OPEN) ? Usr_I_CAN : // Attendance event is open
Usr_I_CAN_NOT; Usr_I_CAN_NOT;
ICanEditTchComment = Usr_I_CAN_NOT; ICanEditTchComment = Usr_I_CAN_NOT;
break; break;
case Rol_TCH: case Rol_TCH:
@ -1912,7 +1907,7 @@ void Att_RegisterMeAsStdInEvent (void)
Events.Event.AttCod = ParCod_GetAndCheckPar (ParCod_Att); Events.Event.AttCod = ParCod_GetAndCheckPar (ParCod_Att);
Att_GetEventDataByCodAndCheckCrs (&Events.Event); // This checks that event belong to current course Att_GetEventDataByCodAndCheckCrs (&Events.Event); // This checks that event belong to current course
if (Events.Event.Open == CloOpe_OPEN) if (Events.Event.ClosedOrOpen == CloOpe_OPEN)
{ {
/***** Get comments for this student *****/ /***** Get comments for this student *****/
Present = Att_CheckIfUsrIsPresentInEventAndGetComments (Events.Event.AttCod,Gbl.Usrs.Me.UsrDat.UsrCod, Present = Att_CheckIfUsrIsPresentInEventAndGetComments (Events.Event.AttCod,Gbl.Usrs.Me.UsrDat.UsrCod,

View File

@ -54,7 +54,7 @@ struct Att_Event
HidVis_HiddenOrVisible_t HiddenOrVisible; HidVis_HiddenOrVisible_t HiddenOrVisible;
long UsrCod; long UsrCod;
time_t TimeUTC[Dat_NUM_START_END_TIME]; time_t TimeUTC[Dat_NUM_START_END_TIME];
CloOpe_ClosedOrOpen_t Open; CloOpe_ClosedOrOpen_t ClosedOrOpen;
bool CommentTchVisible; bool CommentTchVisible;
char Title[Att_MAX_BYTES_ATTENDANCE_EVENT_TITLE + 1]; char Title[Att_MAX_BYTES_ATTENDANCE_EVENT_TITLE + 1];

View File

@ -89,9 +89,10 @@
extern struct Globals Gbl; extern struct Globals Gbl;
/*****************************************************************************/ /*****************************************************************************/
/******************************* Private types *******************************/ /**********n********************* Private types *******************************/
/*****************************************************************************/ /*****************************************************************************/
#define Brw_NUM_ICON_TREE 3
typedef enum typedef enum
{ {
Brw_ICON_TREE_NOTHING, // No icon to expand/contract a subtree Brw_ICON_TREE_NOTHING, // No icon to expand/contract a subtree
@ -1161,9 +1162,11 @@ static void Brw_PutIconFolder (unsigned Level,
const char *FileBrowserId,const char *RowId, const char *FileBrowserId,const char *RowId,
Brw_IconTree_t IconSubtree); Brw_IconTree_t IconSubtree);
static void Brw_PutIconFolderWithoutPlus (const char *FileBrowserId,const char *RowId, static void Brw_PutIconFolderWithoutPlus (const char *FileBrowserId,const char *RowId,
CloOpe_ClosedOrOpen_t Open,HidVis_HiddenOrVisible_t HiddenOrVisible); CloOpe_ClosedOrOpen_t ClosedOrOpen,
HidVis_HiddenOrVisible_t HiddenOrVisible);
static void Brw_PutIconFolderWithPlus (const char *FileBrowserId,const char *RowId, static void Brw_PutIconFolderWithPlus (const char *FileBrowserId,const char *RowId,
CloOpe_ClosedOrOpen_t Open,HidVis_HiddenOrVisible_t HiddenOrVisible); CloOpe_ClosedOrOpen_t ClosedOrOpen,
HidVis_HiddenOrVisible_t HiddenOrVisible);
static void Brw_PutIconNewFileOrFolder (void); static void Brw_PutIconNewFileOrFolder (void);
static void Brw_PutIconFileWithLinkToViewMetadata (const struct Brw_FileMetadata *FileMetadata); static void Brw_PutIconFileWithLinkToViewMetadata (const struct Brw_FileMetadata *FileMetadata);
@ -2113,7 +2116,7 @@ static void Brw_GetDataCurrentGrp (void)
Str_Copy (Gbl.Crs.Grps.GrpName,GrpDat.GrpName, Str_Copy (Gbl.Crs.Grps.GrpName,GrpDat.GrpName,
sizeof (Gbl.Crs.Grps.GrpName) - 1); sizeof (Gbl.Crs.Grps.GrpName) - 1);
Gbl.Crs.Grps.MaxStudents = GrpDat.MaxStudents; Gbl.Crs.Grps.MaxStudents = GrpDat.MaxStudents;
Gbl.Crs.Grps.Open = GrpDat.Open; Gbl.Crs.Grps.ClosedOrOpen = GrpDat.ClosedOrOpen;
Gbl.Crs.Grps.FileZones = GrpDat.FileZones; Gbl.Crs.Grps.FileZones = GrpDat.FileZones;
Gbl.Crs.Grps.GrpTyp.MultipleEnrolment = GrpDat.MultipleEnrolment; Gbl.Crs.Grps.GrpTyp.MultipleEnrolment = GrpDat.MultipleEnrolment;
} }
@ -4475,74 +4478,35 @@ static void Brw_PutIconFolder (unsigned Level,
const char *FileBrowserId,const char *RowId, const char *FileBrowserId,const char *RowId,
Brw_IconTree_t IconSubtree) Brw_IconTree_t IconSubtree)
{ {
static void (*Brw_PutIconFolder[Usr_NUM_I_CAN]) (const char *FileBrowserId,const char *RowId,
CloOpe_ClosedOrOpen_t ClosedOrOpen,
HidVis_HiddenOrVisible_t HiddenOrVisible) =
{
[Usr_I_CAN_NOT] = Brw_PutIconFolderWithoutPlus,
[Usr_I_CAN ] = Brw_PutIconFolderWithPlus,
};
static HidVis_HiddenOrVisible_t HiddenOrVisible[Brw_NUM_ICON_TREE][CloOpe_NUM_CLOSED_OPEN] =
{
[Brw_ICON_TREE_NOTHING ][CloOpe_CLOSED] = HidVis_HIDDEN,
[Brw_ICON_TREE_NOTHING ][CloOpe_OPEN ] = HidVis_VISIBLE,
[Brw_ICON_TREE_EXPAND ][CloOpe_CLOSED] = HidVis_VISIBLE,
[Brw_ICON_TREE_EXPAND ][CloOpe_OPEN ] = HidVis_HIDDEN,
[Brw_ICON_TREE_CONTRACT][CloOpe_CLOSED] = HidVis_HIDDEN,
[Brw_ICON_TREE_CONTRACT][CloOpe_OPEN ] = HidVis_VISIBLE,
};
CloOpe_ClosedOrOpen_t ClosedOrOpen;
Usr_ICan_t ICanCreateIntoFolder = Brw_CheckIfICanCreateIntoFolder (Level);
/***** Begin cell *****/ /***** Begin cell *****/
HTM_TD_Begin ("class=\"BM %s\"",The_GetColorRows ()); HTM_TD_Begin ("class=\"BM %s\"",The_GetColorRows ());
/***** Put icon to create a new file or folder *****/ /* Put two folder icons: · 1st closed (hidden or visible)
switch (Brw_CheckIfICanCreateIntoFolder (Level)) // I can create a new file or folder · 2nd open (hidden or visible) */
{ for (ClosedOrOpen = CloOpe_CLOSED;
case Usr_I_CAN: ClosedOrOpen <= CloOpe_OPEN;
switch (IconSubtree) ClosedOrOpen++)
{ Brw_PutIconFolder[ICanCreateIntoFolder] (FileBrowserId,RowId,ClosedOrOpen,
case Brw_ICON_TREE_EXPAND: HiddenOrVisible[IconSubtree][ClosedOrOpen]);
/* Visible icon with folder closed */
Brw_PutIconFolderWithPlus (FileBrowserId,RowId,
CloOpe_CLOSED, // Closed
HidVis_VISIBLE); // Visible
/* Hidden icon with folder open */
Brw_PutIconFolderWithPlus (FileBrowserId,RowId,
CloOpe_OPEN, // Open
HidVis_HIDDEN); // Hidden
break;
case Brw_ICON_TREE_CONTRACT:
/* Hidden icon with folder closed */
Brw_PutIconFolderWithPlus (FileBrowserId,RowId,
CloOpe_CLOSED, // Closed
HidVis_HIDDEN); // Hidden
/* Visible icon with folder open */
Brw_PutIconFolderWithPlus (FileBrowserId,RowId,
CloOpe_OPEN, // Open
HidVis_VISIBLE); // Visible
break;
case Brw_ICON_TREE_NOTHING:
default:
break;
}
break;
case Usr_I_CAN_NOT:
default:
switch (IconSubtree)
{
case Brw_ICON_TREE_EXPAND:
/* Visible icon with folder closed */
Brw_PutIconFolderWithoutPlus (FileBrowserId,RowId,
CloOpe_CLOSED, // Closed
HidVis_VISIBLE);
/* Hidden icon with folder open */
Brw_PutIconFolderWithoutPlus (FileBrowserId,RowId,
CloOpe_OPEN, // Open
HidVis_HIDDEN);
break;
case Brw_ICON_TREE_CONTRACT:
/* Hidden icon with folder closed */
Brw_PutIconFolderWithoutPlus (FileBrowserId,RowId,
CloOpe_CLOSED, // Closed
HidVis_HIDDEN);
/* Visible icon with folder open */
Brw_PutIconFolderWithoutPlus (FileBrowserId,RowId,
CloOpe_OPEN, // Open
HidVis_VISIBLE);
break;
case Brw_ICON_TREE_NOTHING:
default:
break;
}
break;
}
/***** End cell *****/ /***** End cell *****/
HTM_TD_End (); HTM_TD_End ();
@ -4553,24 +4517,26 @@ static void Brw_PutIconFolder (unsigned Level,
/*****************************************************************************/ /*****************************************************************************/
static void Brw_PutIconFolderWithoutPlus (const char *FileBrowserId,const char *RowId, static void Brw_PutIconFolderWithoutPlus (const char *FileBrowserId,const char *RowId,
CloOpe_ClosedOrOpen_t Open,HidVis_HiddenOrVisible_t HiddenOrVisible) CloOpe_ClosedOrOpen_t ClosedOrOpen,
HidVis_HiddenOrVisible_t HiddenOrVisible)
{ {
extern const char *Txt_Folder; extern const char *CloOpe_Txt[CloOpe_NUM_CLOSED_OPEN];
extern const char *HidVis_ShownStyle[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_ShownStyle[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *Txt_Folder;
static const char *CloOpe_Icon[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = "folder-closed-yellow.png",
[CloOpe_OPEN ] = "folder-open-yellow.png",
};
/***** Begin container *****/ /***** Begin container *****/
HTM_DIV_Begin ("id=\"folder_%s_%s_%s\" class=\"%s\"%s", HTM_DIV_Begin ("id=\"folder_%s_%s_%s\" class=\"%s\"%s",
Open == CloOpe_OPEN ? "open" : CloOpe_Txt[ClosedOrOpen],FileBrowserId,RowId,
"closed", The_GetColorRows (),HidVis_ShownStyle[HiddenOrVisible]);
FileBrowserId,RowId,
The_GetColorRows (),
HidVis_ShownStyle[HiddenOrVisible]);
/***** Icon *****/ /***** Icon *****/
Ico_PutIcon (Open == CloOpe_OPEN ? "folder-open-yellow.png" : Ico_PutIcon (CloOpe_Icon[ClosedOrOpen],Ico_UNCHANGED,Txt_Folder,
"folder-yellow.png", "CONTEXT_OPT CONTEXT_ICO16x16");
Ico_UNCHANGED,
Txt_Folder,"CONTEXT_OPT CONTEXT_ICO16x16");
/***** End container *****/ /***** End container *****/
HTM_DIV_End (); HTM_DIV_End ();
@ -4581,22 +4547,21 @@ static void Brw_PutIconFolderWithoutPlus (const char *FileBrowserId,const char *
/*****************************************************************************/ /*****************************************************************************/
static void Brw_PutIconFolderWithPlus (const char *FileBrowserId,const char *RowId, static void Brw_PutIconFolderWithPlus (const char *FileBrowserId,const char *RowId,
CloOpe_ClosedOrOpen_t Open,HidVis_HiddenOrVisible_t HiddenOrVisible) CloOpe_ClosedOrOpen_t ClosedOrOpen,
HidVis_HiddenOrVisible_t HiddenOrVisible)
{ {
extern const char *CloOpe_Txt[CloOpe_NUM_CLOSED_OPEN];
extern const char *HidVis_ShownStyle[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_ShownStyle[HidVis_NUM_HIDDEN_VISIBLE];
/***** Begin container *****/ /***** Begin container *****/
HTM_DIV_Begin ("id=\"folder_%s_%s_%s\" class=\"%s\"%s", HTM_DIV_Begin ("id=\"folder_%s_%s_%s\" class=\"%s\"%s",
Open == CloOpe_OPEN ? "open" : CloOpe_Txt[ClosedOrOpen],FileBrowserId,RowId,
"closed", The_GetColorRows (),HidVis_ShownStyle[HiddenOrVisible]);
FileBrowserId,RowId,
The_GetColorRows (),
HidVis_ShownStyle[HiddenOrVisible]);
/***** Form and icon *****/ /***** Form and icon *****/
Ico_PutContextualIconToCreateInFolder (Brw_ActFormCreate[Gbl.FileBrowser.Type], Ico_PutContextualIconToCreateInFolder (Brw_ActFormCreate[Gbl.FileBrowser.Type],
Brw_PutImplicitParsFileBrowser,&Gbl.FileBrowser.FilFolLnk, Brw_PutImplicitParsFileBrowser,&Gbl.FileBrowser.FilFolLnk,
Open); ClosedOrOpen);
/***** End container *****/ /***** End container *****/
HTM_DIV_End (); HTM_DIV_End ();
@ -9478,7 +9443,7 @@ static void Brw_WriteRowDocData (unsigned *NumDocsNotHidden,MYSQL_ROW row)
Frm_DONT_PUT_FORM); // Don't put link to view metadata Frm_DONT_PUT_FORM); // Don't put link to view metadata
break; break;
case Brw_IS_FOLDER: case Brw_IS_FOLDER:
Ico_PutIcon ("folder-yellow.png",Ico_UNCHANGED, Ico_PutIcon ("folder-closed-yellow.png",Ico_UNCHANGED,
Txt_Folder,"CONTEXT_ICO16x16"); Txt_Folder,"CONTEXT_ICO16x16");
break; break;
case Brw_IS_LINK: case Brw_IS_LINK:

View File

@ -327,7 +327,7 @@ static void CtrCfg_Map (const struct Map_Coordinates *Coord)
/* Add popup */ /* Add popup */
Map_AddPopup (Gbl.Hierarchy.Node[Hie_CTR].ShrtName, Map_AddPopup (Gbl.Hierarchy.Node[Hie_CTR].ShrtName,
Gbl.Hierarchy.Node[Hie_INS].ShrtName, Gbl.Hierarchy.Node[Hie_INS].ShrtName,
CloOpe_OPEN); // Open CloOpe_OPEN);
HTM_SCRIPT_End (); HTM_SCRIPT_End ();
} }

View File

@ -633,10 +633,15 @@ Me sale este error, no s
"can npt create received message (duplicated entry '243218-2160773' for key 'UsrCod_MsgCod') "can npt create received message (duplicated entry '243218-2160773' for key 'UsrCod_MsgCod')
*/ */
#define Log_PLATFORM_VERSION "SWAD 23.74 (2024-04-07)" #define Log_PLATFORM_VERSION "SWAD 23.75 (2024-04-13)"
#define CSS_FILE "swad23.67.2.css" #define CSS_FILE "swad23.67.2.css"
#define JS_FILE "swad23.53.6.js" #define JS_FILE "swad23.53.6.js"
/* /*
Version 23.75: Apr 13, 2024 Code refactoring related to closed/open. (335484 lines)
Copy the following icons to icon public directory:
sudo cp icon/folder-closed-yellow.png /var/www/html/swad/icon/
sudo cp icon/folder-closed-yellow-plus.png /var/www/html/swad/icon/
Version 23.74: Apr 07, 2024 New type CloOpe_ClosedOrOpen_t. (335553 lines) Version 23.74: Apr 07, 2024 New type CloOpe_ClosedOrOpen_t. (335553 lines)
Version 23.73: Apr 06, 2024 Code refactoring related to new type Usr_ICan_t. (335399 lines) Version 23.73: Apr 06, 2024 Code refactoring related to new type Usr_ICan_t. (335399 lines)
Version 23.72.2: Apr 02, 2024 Code refactoring related to new type Usr_ICan_t. (334970 lines) Version 23.72.2: Apr 02, 2024 Code refactoring related to new type Usr_ICan_t. (334970 lines)

View File

@ -26,76 +26,41 @@
/*****************************************************************************/ /*****************************************************************************/
#include "swad_closed_open.h" #include "swad_closed_open.h"
#include "swad_hidden_visible.h"
/*****************************************************************************/ /*****************************************************************************/
/****************************** Public constants *****************************/ /****************************** Public constants *****************************/
/*****************************************************************************/ /*****************************************************************************/
/* Open in database fields */ const char *CloOpe_Txt[CloOpe_NUM_CLOSED_OPEN] =
const char CloOpe_YN[CloOpe_NUM_CLOSED_OPEN] =
{ {
[CloOpe_CLOSED] = 'Y', [CloOpe_CLOSED] = "closed",
[CloOpe_OPEN ] = 'N', [CloOpe_OPEN ] = "open",
}; };
/*
const char *CloOpe_DateGreenClass[CloOpe_NUM_CLOSED_OPEN] = const char *CloOpe_Class[CloOpe_NUM_CLOSED_OPEN][HidVis_NUM_HIDDEN_VISIBLE] =
{ {
[CloOpe_CLOSED] = "DATE_GREEN_LIGHT", [CloOpe_CLOSED][HidVis_HIDDEN ] = "DATE_RED_LIGHT",
[CloOpe_OPEN ] = "DATE_GREEN", [CloOpe_CLOSED][HidVis_VISIBLE] = "DATE_RED",
[CloOpe_OPEN ][HidVis_HIDDEN ] = "DATE_GREEN_LIGHT",
[CloOpe_OPEN ][HidVis_VISIBLE] = "DATE_GREEN",
}; };
const char *CloOpe_DateRedClass[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = "DATE_RED_LIGHT",
[CloOpe_OPEN ] = "DATE_RED",
};
const char *CloOpe_DateBlueClass[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED ] = "DATE_BLUE_LIGHT",
[CloOpe_OPEN] = "DATE_BLUE",
};
const char *CloOpe_TitleClass[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = "ASG_TITLE_LIGHT",
[CloOpe_OPEN ] = "ASG_TITLE",
};
const char *CloOpe_GroupClass[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = "ASG_GRP_LIGHT",
[CloOpe_OPEN ] = "ASG_GRP",
};
const char *CloOpe_LabelClass[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = "ASG_LABEL_LIGHT",
[CloOpe_OPEN ] = "ASG_LABEL",
};
const char *CloOpe_DataClass[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = "DAT_LIGHT",
[CloOpe_OPEN ] = "DAT",
};
const char *CloOpe_MsgClass[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = "MSG_AUT_LIGHT",
[CloOpe_OPEN ] = "MSG_AUT",
};
const char *CloOpe_PrgClass[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = " PRG_HIDDEN",
[CloOpe_OPEN ] = "",
};
const char *CloOpe_ShownStyle[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = " style=\"display:none;\"",
[CloOpe_OPEN ] = "",
};
*/
/*****************************************************************************/ /*****************************************************************************/
/****************** Get if closed or open from a character *******************/ /************** Get if closed or open from a '0'/'1' character ***************/
/*****************************************************************************/ /*****************************************************************************/
CloOpe_ClosedOrOpen_t CloOpe_GetClosedOrOpen (char Ch) CloOpe_ClosedOrOpen_t CloOpe_GetClosedOrOpenFrom01 (char Ch)
{
return (Ch == '1') ? CloOpe_OPEN :
CloOpe_CLOSED;
}
/*****************************************************************************/
/************** Get if closed or open from a 'Y'/'N' character ***************/
/*****************************************************************************/
CloOpe_ClosedOrOpen_t CloOpe_GetClosedOrOpenFromYN (char Ch)
{ {
return (Ch == 'Y') ? CloOpe_OPEN : return (Ch == 'Y') ? CloOpe_OPEN :
CloOpe_CLOSED; CloOpe_CLOSED;
} }

View File

@ -44,6 +44,7 @@ typedef enum
/****************************** Public prototypes ****************************/ /****************************** Public prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
CloOpe_ClosedOrOpen_t CloOpe_GetClosedOrOpen (char c); CloOpe_ClosedOrOpen_t CloOpe_GetClosedOrOpenFrom01 (char Ch);
CloOpe_ClosedOrOpen_t CloOpe_GetClosedOrOpenFromYN (char Ch);
#endif #endif

View File

@ -445,13 +445,12 @@ void Exa_ShowOnlyOneExamEnd (void)
static void Exa_ShowOneExam (struct Exa_Exams *Exams,bool ShowOnlyThisExam) static void Exa_ShowOneExam (struct Exa_Exams *Exams,bool ShowOnlyThisExam)
{ {
extern const char *CloOpe_Class[CloOpe_NUM_CLOSED_OPEN][HidVis_NUM_HIDDEN_VISIBLE];
extern const char *Txt_View_exam; extern const char *Txt_View_exam;
extern const char *Txt_Sets_of_questions; extern const char *Txt_Sets_of_questions;
extern const char *Txt_Maximum_grade; extern const char *Txt_Maximum_grade;
extern const char *Txt_Result_visibility; extern const char *Txt_Result_visibility;
extern const char *Txt_Sessions; extern const char *Txt_Sessions;
extern const char *HidVis_DateGreenClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_DateRedClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_TitleClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_TitleClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_GroupClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_GroupClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_DataClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_DataClass[HidVis_NUM_HIDDEN_VISIBLE];
@ -459,7 +458,8 @@ static void Exa_ShowOneExam (struct Exa_Exams *Exams,bool ShowOnlyThisExam)
static unsigned UniqueId = 0; static unsigned UniqueId = 0;
char *Id; char *Id;
Dat_StartEndTime_t StartEndTime; Dat_StartEndTime_t StartEndTime;
const char *DateClass; CloOpe_ClosedOrOpen_t ClosedOrOpen = Exams->Exam.NumOpenSess ? CloOpe_OPEN :
CloOpe_CLOSED;
char Txt[Cns_MAX_BYTES_TEXT + 1]; char Txt[Cns_MAX_BYTES_TEXT + 1];
/***** Build anchor string *****/ /***** Build anchor string *****/
@ -490,14 +490,16 @@ static void Exa_ShowOneExam (struct Exa_Exams *Exams,bool ShowOnlyThisExam)
if (asprintf (&Id,"exa_date_%u_%u",(unsigned) StartEndTime,UniqueId) < 0) if (asprintf (&Id,"exa_date_%u_%u",(unsigned) StartEndTime,UniqueId) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
DateClass = Exams->Exam.NumOpenSess ? HidVis_DateGreenClass[Exams->Exam.HiddenOrVisible] :
HidVis_DateRedClass[Exams->Exam.HiddenOrVisible];
if (ShowOnlyThisExam) if (ShowOnlyThisExam)
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"", HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"",
Id,DateClass,The_GetSuffix ()); Id,
CloOpe_Class[ClosedOrOpen][Exams->Exam.HiddenOrVisible],
The_GetSuffix ());
else else
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"", HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
Id,DateClass,The_GetSuffix (),The_GetColorRows ()); Id,
CloOpe_Class[ClosedOrOpen][Exams->Exam.HiddenOrVisible],
The_GetSuffix (),The_GetColorRows ());
if (Exams->Exam.TimeUTC[Dat_STR_TIME]) if (Exams->Exam.TimeUTC[Dat_STR_TIME])
Dat_WriteLocalDateHMSFromUTC (Id,Exams->Exam.TimeUTC[StartEndTime], Dat_WriteLocalDateHMSFromUTC (Id,Exams->Exam.TimeUTC[StartEndTime],
Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK, Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK,

View File

@ -127,7 +127,7 @@ void ExaSes_ResetSession (struct ExaSes_Session *Session)
Session->TimeUTC[StartEndTime] = (time_t) 0; Session->TimeUTC[StartEndTime] = (time_t) 0;
Session->Title[0] = '\0'; Session->Title[0] = '\0';
Session->HiddenOrVisible = HidVis_VISIBLE; Session->HiddenOrVisible = HidVis_VISIBLE;
Session->Open = CloOpe_CLOSED; Session->ClosedOrOpen = CloOpe_CLOSED;
Session->ShowUsrResults = false; Session->ShowUsrResults = false;
}; };
@ -459,23 +459,20 @@ static void ExaSes_ListOneOrMoreSessionsAuthor (const struct ExaSes_Session *Ses
static void ExaSes_ListOneOrMoreSessionsTimes (const struct ExaSes_Session *Session, static void ExaSes_ListOneOrMoreSessionsTimes (const struct ExaSes_Session *Session,
unsigned UniqueId) unsigned UniqueId)
{ {
extern const char *HidVis_DateGreenClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *CloOpe_Class[CloOpe_NUM_CLOSED_OPEN][HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_DateRedClass[HidVis_NUM_HIDDEN_VISIBLE];
Dat_StartEndTime_t StartEndTime; Dat_StartEndTime_t StartEndTime;
const char *DateClass;
char *Id; char *Id;
for (StartEndTime = (Dat_StartEndTime_t) 0; for (StartEndTime = (Dat_StartEndTime_t) 0;
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1); StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
StartEndTime++) StartEndTime++)
{ {
DateClass = Session->Open == CloOpe_OPEN ? HidVis_DateGreenClass[Session->HiddenOrVisible] :
HidVis_DateRedClass[Session->HiddenOrVisible];
if (asprintf (&Id,"exa_time_%u_%u",(unsigned) StartEndTime,UniqueId) < 0) if (asprintf (&Id,"exa_time_%u_%u",(unsigned) StartEndTime,UniqueId) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"", HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
Id,DateClass,The_GetSuffix (),The_GetColorRows ()); Id,
CloOpe_Class[Session->ClosedOrOpen][Session->HiddenOrVisible],
The_GetSuffix (),The_GetColorRows ());
Dat_WriteLocalDateHMSFromUTC (Id,Session->TimeUTC[StartEndTime], Dat_WriteLocalDateHMSFromUTC (Id,Session->TimeUTC[StartEndTime],
Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK, Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK,
true,true,true,0x6); true,true,true,0x6);
@ -751,8 +748,7 @@ static void ExaSes_GetSessionDataFromRow (MYSQL_RES *mysql_res,
Session->TimeUTC[StartEndTime] = Dat_GetUNIXTimeFromStr (row[4 + StartEndTime]); Session->TimeUTC[StartEndTime] = Dat_GetUNIXTimeFromStr (row[4 + StartEndTime]);
/* Get whether the session is open or closed (row(6)) */ /* Get whether the session is open or closed (row(6)) */
Session->Open = (row[6][0] == '1') ? CloOpe_OPEN : Session->ClosedOrOpen = CloOpe_GetClosedOrOpenFrom01 (row[6][0]);
CloOpe_CLOSED;
/* Get the title of the session (row[7]) */ /* Get the title of the session (row[7]) */
if (row[7]) if (row[7])
@ -1219,7 +1215,7 @@ Usr_ICan_t ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam,
2. Hidden or closed sessions are not accesible *****/ 2. Hidden or closed sessions are not accesible *****/
if (Exam->HiddenOrVisible == HidVis_HIDDEN || if (Exam->HiddenOrVisible == HidVis_HIDDEN ||
Session->HiddenOrVisible == HidVis_HIDDEN || Session->HiddenOrVisible == HidVis_HIDDEN ||
Session->Open == CloOpe_CLOSED) Session->ClosedOrOpen == CloOpe_CLOSED)
return Usr_I_CAN_NOT; return Usr_I_CAN_NOT;
/***** Exam is visible, session is visible and open ==> /***** Exam is visible, session is visible and open ==>

View File

@ -148,8 +148,8 @@ struct ExaSes_Session
time_t TimeUTC[Dat_NUM_START_END_TIME]; time_t TimeUTC[Dat_NUM_START_END_TIME];
char Title[ExaSes_MAX_BYTES_TITLE + 1]; char Title[ExaSes_MAX_BYTES_TITLE + 1];
HidVis_HiddenOrVisible_t HiddenOrVisible; HidVis_HiddenOrVisible_t HiddenOrVisible;
CloOpe_ClosedOrOpen_t Open; // If now is between start and end dates CloOpe_ClosedOrOpen_t ClosedOrOpen; // If now is between start and end dates
bool ShowUsrResults; // Show exam with results of all questions for the student bool ShowUsrResults; // Show exam with results of all questions for the student
}; };
#endif #endif

View File

@ -505,13 +505,12 @@ void Gam_ShowOnlyOneGameEnd (void)
static void Gam_ShowGameMainData (struct Gam_Games *Games, static void Gam_ShowGameMainData (struct Gam_Games *Games,
bool ShowOnlyThisGame) bool ShowOnlyThisGame)
{ {
extern const char *CloOpe_Class[CloOpe_NUM_CLOSED_OPEN][HidVis_NUM_HIDDEN_VISIBLE];
extern const char *Txt_View_game; extern const char *Txt_View_game;
extern const char *Txt_Number_of_questions; extern const char *Txt_Number_of_questions;
extern const char *Txt_Maximum_grade; extern const char *Txt_Maximum_grade;
extern const char *Txt_Result_visibility; extern const char *Txt_Result_visibility;
extern const char *Txt_Matches; extern const char *Txt_Matches;
extern const char *HidVis_DateGreenClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_DateRedClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_TitleClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_TitleClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_GroupClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_GroupClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_DataClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_DataClass[HidVis_NUM_HIDDEN_VISIBLE];
@ -519,7 +518,8 @@ static void Gam_ShowGameMainData (struct Gam_Games *Games,
static unsigned UniqueId = 0; static unsigned UniqueId = 0;
char *Id; char *Id;
Dat_StartEndTime_t StartEndTime; Dat_StartEndTime_t StartEndTime;
const char *DateClass; CloOpe_ClosedOrOpen_t ClosedOrOpen = (Games->Game.NumUnfinishedMchs) ? CloOpe_OPEN :
CloOpe_CLOSED;
char Txt[Cns_MAX_BYTES_TEXT + 1]; char Txt[Cns_MAX_BYTES_TEXT + 1];
/***** Set anchor string *****/ /***** Set anchor string *****/
@ -549,14 +549,17 @@ static void Gam_ShowGameMainData (struct Gam_Games *Games,
{ {
if (asprintf (&Id,"gam_date_%u_%u",(unsigned) StartEndTime,UniqueId) < 0) if (asprintf (&Id,"gam_date_%u_%u",(unsigned) StartEndTime,UniqueId) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
DateClass = Games->Game.NumUnfinishedMchs ? HidVis_DateGreenClass[Games->Game.HiddenOrVisible] :
HidVis_DateRedClass[Games->Game.HiddenOrVisible];
if (ShowOnlyThisGame) if (ShowOnlyThisGame)
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"", HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"",
Id,DateClass,The_GetSuffix ()); Id,
CloOpe_Class[ClosedOrOpen][Games->Game.HiddenOrVisible],
The_GetSuffix ());
else else
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"", HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
Id,DateClass,The_GetSuffix (),The_GetColorRows ()); Id,
CloOpe_Class[ClosedOrOpen][Games->Game.HiddenOrVisible],
The_GetSuffix (),The_GetColorRows ());
if (Games->Game.TimeUTC[Dat_STR_TIME]) if (Games->Game.TimeUTC[Dat_STR_TIME])
Dat_WriteLocalDateHMSFromUTC (Id,Games->Game.TimeUTC[StartEndTime], Dat_WriteLocalDateHMSFromUTC (Id,Games->Game.TimeUTC[StartEndTime],
Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK, Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK,

View File

@ -174,7 +174,7 @@ void Gbl_InitializeGlobals (void)
Gbl.Crs.Grps.GrpName[0] = '\0'; Gbl.Crs.Grps.GrpName[0] = '\0';
Gbl.Crs.Grps.RooCod = -1L; // -1L stands for no room assigned Gbl.Crs.Grps.RooCod = -1L; // -1L stands for no room assigned
Gbl.Crs.Grps.MaxStudents = Grp_NUM_STUDENTS_NOT_LIMITED; Gbl.Crs.Grps.MaxStudents = Grp_NUM_STUDENTS_NOT_LIMITED;
Gbl.Crs.Grps.Open = CloOpe_CLOSED; Gbl.Crs.Grps.ClosedOrOpen = CloOpe_CLOSED;
Gbl.Crs.Grps.LstGrpsSel.GrpCods = NULL; Gbl.Crs.Grps.LstGrpsSel.GrpCods = NULL;
Gbl.Crs.Grps.LstGrpsSel.NumGrps = 0; Gbl.Crs.Grps.LstGrpsSel.NumGrps = 0;
Gbl.Crs.Grps.LstGrpsSel.NestedCalls = 0; Gbl.Crs.Grps.LstGrpsSel.NestedCalls = 0;

View File

@ -778,7 +778,7 @@ bool Grp_ChangeMyGrpsAtomically (struct ListCodGrps *LstGrpsIWant)
NumGrpThisType < GrpTyp->NumGrps && !ITryToLeaveAClosedGroup; NumGrpThisType < GrpTyp->NumGrps && !ITryToLeaveAClosedGroup;
NumGrpThisType++) NumGrpThisType++)
if ((GrpTyp->LstGrps[NumGrpThisType]).GrpCod == LstGrpsIBelong.GrpCods[NumGrpIBelong]) if ((GrpTyp->LstGrps[NumGrpThisType]).GrpCod == LstGrpsIBelong.GrpCods[NumGrpIBelong])
if ((GrpTyp->LstGrps[NumGrpThisType]).Open == CloOpe_CLOSED) if ((GrpTyp->LstGrps[NumGrpThisType]).ClosedOrOpen == CloOpe_CLOSED)
ITryToLeaveAClosedGroup = true; ITryToLeaveAClosedGroup = true;
} }
} }
@ -814,7 +814,7 @@ bool Grp_ChangeMyGrpsAtomically (struct ListCodGrps *LstGrpsIWant)
if ((GrpTyp->LstGrps[NumGrpThisType]).GrpCod == LstGrpsIWant->GrpCods[NumGrpIWant]) if ((GrpTyp->LstGrps[NumGrpThisType]).GrpCod == LstGrpsIWant->GrpCods[NumGrpIWant])
{ {
/* Check if the group is closed */ /* Check if the group is closed */
if ((GrpTyp->LstGrps[NumGrpThisType]).Open == CloOpe_CLOSED) if ((GrpTyp->LstGrps[NumGrpThisType]).ClosedOrOpen == CloOpe_CLOSED)
ITryToRegisterInAClosedGroup = true; ITryToRegisterInAClosedGroup = true;
/* Check if the group is full */ /* Check if the group is full */
else if ((GrpTyp->LstGrps[NumGrpThisType]).NumUsrs[Rol_STD] >= else if ((GrpTyp->LstGrps[NumGrpThisType]).NumUsrs[Rol_STD] >=
@ -1389,6 +1389,21 @@ static void Grp_ListGroupsForEdition (const struct Roo_Rooms *Rooms)
{ {
extern const char *Txt_No_assigned_room; extern const char *Txt_No_assigned_room;
extern const char *Txt_Another_room; extern const char *Txt_Another_room;
static Act_Action_t NextAction[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = ActOpeGrp,
[CloOpe_OPEN ] = ActCloGrp,
};
static const char *Icon[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = "lock.svg",
[CloOpe_OPEN ] = "unlock.svg",
};
static Ico_Color_t Color[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = Ico_RED,
[CloOpe_OPEN ] = Ico_GREEN,
};
unsigned NumGrpTyp1; unsigned NumGrpTyp1;
const struct GroupType *GrpTyp1; const struct GroupType *GrpTyp1;
unsigned NumGrpTyp2; unsigned NumGrpTyp2;
@ -1428,16 +1443,12 @@ static void Grp_ListGroupsForEdition (const struct Roo_Rooms *Rooms)
/***** Icon to open/close group *****/ /***** Icon to open/close group *****/
HTM_TD_Begin ("class=\"BM\""); HTM_TD_Begin ("class=\"BM\"");
Frm_BeginFormAnchor (Grp->Open == CloOpe_OPEN ? ActCloGrp : Frm_BeginFormAnchor (NextAction[Grp->ClosedOrOpen],
ActOpeGrp,
Grp_GROUPS_SECTION_ID); Grp_GROUPS_SECTION_ID);
ParCod_PutPar (ParCod_Grp,Grp->GrpCod); ParCod_PutPar (ParCod_Grp,Grp->GrpCod);
Ico_PutIconLink (Grp->Open == CloOpe_OPEN ? "unlock.svg" : Ico_PutIconLink (Icon[Grp->ClosedOrOpen],
"lock.svg", Color[Grp->ClosedOrOpen],
Grp->Open == CloOpe_OPEN ? Ico_GREEN : NextAction[Grp->ClosedOrOpen]);
Ico_RED,
Grp->Open == CloOpe_OPEN ? ActCloGrp :
ActOpeGrp);
Frm_EndForm (); Frm_EndForm ();
HTM_TD_End (); HTM_TD_End ();
@ -1863,7 +1874,7 @@ static Usr_ICan_t Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
NumGrpThisType++) NumGrpThisType++)
{ {
Grp = &(GrpTyp->LstGrps[NumGrpThisType]); Grp = &(GrpTyp->LstGrps[NumGrpThisType]);
if (Grp->Open == CloOpe_OPEN) // If group is open if (Grp->ClosedOrOpen == CloOpe_OPEN) // If group is open
{ {
IBelongToThisGroup = Grp_CheckIfGrpIsInList (Grp->GrpCod,&LstGrpsIBelong); IBelongToThisGroup = Grp_CheckIfGrpIsInList (Grp->GrpCod,&LstGrpsIBelong);
if (IBelongToThisGroup) // I belong to this group if (IBelongToThisGroup) // I belong to this group
@ -1882,7 +1893,7 @@ static Usr_ICan_t Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
NumGrpThisType++) NumGrpThisType++)
{ {
Grp = &(GrpTyp->LstGrps[NumGrpThisType]); Grp = &(GrpTyp->LstGrps[NumGrpThisType]);
if (Grp->Open == CloOpe_CLOSED) // If group is closed if (Grp->ClosedOrOpen == CloOpe_CLOSED) // If group is closed
{ {
IBelongToThisGroup = Grp_CheckIfGrpIsInList (Grp->GrpCod,&LstGrpsIBelong); IBelongToThisGroup = Grp_CheckIfGrpIsInList (Grp->GrpCod,&LstGrpsIBelong);
if (IBelongToThisGroup) // I belong to this group if (IBelongToThisGroup) // I belong to this group
@ -1900,7 +1911,7 @@ static Usr_ICan_t Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
NumGrpThisType++) NumGrpThisType++)
{ {
Grp = &(GrpTyp->LstGrps[NumGrpThisType]); Grp = &(GrpTyp->LstGrps[NumGrpThisType]);
if (Grp->Open == CloOpe_OPEN && // If group is open... if (Grp->ClosedOrOpen == CloOpe_OPEN && // If group is open...
Grp->NumUsrs[Rol_STD] < Grp->MaxStudents) // ...and not full Grp->NumUsrs[Rol_STD] < Grp->MaxStudents) // ...and not full
{ {
IBelongToThisGroup = Grp_CheckIfGrpIsInList (Grp->GrpCod,&LstGrpsIBelong); IBelongToThisGroup = Grp_CheckIfGrpIsInList (Grp->GrpCod,&LstGrpsIBelong);
@ -1933,7 +1944,7 @@ static Usr_ICan_t Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
case Usr_I_CAN: case Usr_I_CAN:
ICanChangeMySelectionForThisGrp = Usr_I_CAN; ICanChangeMySelectionForThisGrp = Usr_I_CAN;
if (Gbl.Usrs.Me.Role.Logged == Rol_STD) if (Gbl.Usrs.Me.Role.Logged == Rol_STD)
switch (Grp->Open) switch (Grp->ClosedOrOpen)
{ {
case CloOpe_OPEN: // If group is open case CloOpe_OPEN: // If group is open
if (!IBelongToThisGroup && // I don't belong to group if (!IBelongToThisGroup && // I don't belong to group
@ -2336,18 +2347,28 @@ static void Grp_WriteRowGrp (struct Group *Grp,Lay_Highlight_t Highlight)
[Lay_NO_HIGHLIGHT] = "", [Lay_NO_HIGHLIGHT] = "",
[Lay_HIGHLIGHT ] = " BG_HIGHLIGHT", [Lay_HIGHLIGHT ] = " BG_HIGHLIGHT",
}; };
static const char **TitleFormat[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = &Txt_Group_X_closed,
[CloOpe_OPEN ] = &Txt_Group_X_open,
};
static const char *Icon[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = "lock.svg",
[CloOpe_OPEN ] = "unlock.svg",
};
static Ico_Color_t Color[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = Ico_RED,
[CloOpe_OPEN ] = Ico_GREEN,
};
/***** Write icon to show if group is open or closed *****/ /***** Write icon to show if group is open or closed *****/
HTM_TD_Begin ("class=\"BM%s\"",HighlightClass[Highlight]); HTM_TD_Begin ("class=\"BM%s\"",HighlightClass[Highlight]);
if (asprintf (&Title,Grp->Open == CloOpe_OPEN ? Txt_Group_X_open : if (asprintf (&Title,*TitleFormat[Grp->ClosedOrOpen],Grp->GrpName) < 0)
Txt_Group_X_closed,
Grp->GrpName) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
Ico_PutIconOff (Grp->Open == CloOpe_OPEN ? "unlock.svg" : Ico_PutIconOff (Icon[Grp->ClosedOrOpen],Color[Grp->ClosedOrOpen],Title);
"lock.svg",
Grp->Open == CloOpe_OPEN ? Ico_GREEN :
Ico_RED,
Title);
free (Title); free (Title);
HTM_TD_End (); HTM_TD_End ();
@ -2848,8 +2869,7 @@ void Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_WhichGroupTypes_t WhichGroupTypes)
/* Get whether group is open ('Y') or closed ('N') (row[5]), /* Get whether group is open ('Y') or closed ('N') (row[5]),
and whether group have file zones ('Y') or not ('N') (row[6]) */ and whether group have file zones ('Y') or not ('N') (row[6]) */
Grp->Open = (row[5][0] == 'Y') ? CloOpe_OPEN : Grp->ClosedOrOpen = CloOpe_GetClosedOrOpenFromYN (row[5][0]);
CloOpe_CLOSED;
Grp->FileZones = (row[6][0] == 'Y'); Grp->FileZones = (row[6][0] == 'Y');
} }
} }
@ -2962,7 +2982,7 @@ void Grp_GetGroupDataByCod (struct GroupData *GrpDat)
GrpDat->Room.ShrtName[0] = '\0'; GrpDat->Room.ShrtName[0] = '\0';
GrpDat->MaxStudents = 0; GrpDat->MaxStudents = 0;
GrpDat->Vacant = 0; GrpDat->Vacant = 0;
GrpDat->Open = CloOpe_CLOSED; GrpDat->ClosedOrOpen = CloOpe_CLOSED;
GrpDat->FileZones = false; GrpDat->FileZones = false;
GrpDat->MultipleEnrolment = false; GrpDat->MultipleEnrolment = false;
@ -3006,8 +3026,7 @@ void Grp_GetGroupDataByCod (struct GroupData *GrpDat)
/* Get whether group is open or closed (row[8]), /* Get whether group is open or closed (row[8]),
and whether group has file zones (row[9]) */ and whether group has file zones (row[9]) */
GrpDat->Open = (row[8][0] == 'Y') ? CloOpe_OPEN : GrpDat->ClosedOrOpen = CloOpe_GetClosedOrOpenFromYN (row[8][0]);
CloOpe_CLOSED;
GrpDat->FileZones = (row[9][0] == 'Y'); GrpDat->FileZones = (row[9][0] == 'Y');
} }
@ -3602,7 +3621,7 @@ void Grp_OpenGroup (void)
GrpDat.GrpName); GrpDat.GrpName);
/***** Show the form again *****/ /***** Show the form again *****/
Gbl.Crs.Grps.Open = CloOpe_OPEN; Gbl.Crs.Grps.ClosedOrOpen = CloOpe_OPEN;
Grp_ReqEditGroupsInternal (Ale_INFO,NULL, Grp_ReqEditGroupsInternal (Ale_INFO,NULL,
Ale_SUCCESS,AlertTxt); Ale_SUCCESS,AlertTxt);
} }
@ -3632,7 +3651,7 @@ void Grp_CloseGroup (void)
GrpDat.GrpName); GrpDat.GrpName);
/***** Show the form again *****/ /***** Show the form again *****/
Gbl.Crs.Grps.Open = CloOpe_CLOSED; Gbl.Crs.Grps.ClosedOrOpen = CloOpe_CLOSED;
Grp_ReqEditGroupsInternal (Ale_INFO,NULL, Grp_ReqEditGroupsInternal (Ale_INFO,NULL,
Ale_SUCCESS,AlertTxt); Ale_SUCCESS,AlertTxt);
} }

View File

@ -71,7 +71,7 @@ struct GroupData
} Room; } Room;
unsigned MaxStudents; unsigned MaxStudents;
int Vacant; int Vacant;
CloOpe_ClosedOrOpen_t Open; // Group is open? CloOpe_ClosedOrOpen_t ClosedOrOpen; // Group is closed or open?
bool FileZones; // Group has file zones? bool FileZones; // Group has file zones?
bool MultipleEnrolment; bool MultipleEnrolment;
}; };
@ -87,7 +87,7 @@ struct Group
} Room; } Room;
unsigned NumUsrs[Rol_NUM_ROLES]; // Number of users in the group unsigned NumUsrs[Rol_NUM_ROLES]; // Number of users in the group
unsigned MaxStudents; // Maximum number of students in the group unsigned MaxStudents; // Maximum number of students in the group
CloOpe_ClosedOrOpen_t Open; // Group is open? CloOpe_ClosedOrOpen_t ClosedOrOpen; // Group is closed or open?
bool FileZones; // Group has file zones? bool FileZones; // Group has file zones?
bool ShowFileZone; // Show file zone of this group? bool ShowFileZone; // Show file zone of this group?
}; };
@ -152,7 +152,7 @@ struct Grp_Groups
char GrpName[Grp_MAX_BYTES_GROUP_NAME + 1]; char GrpName[Grp_MAX_BYTES_GROUP_NAME + 1];
long RooCod; long RooCod;
unsigned MaxStudents; unsigned MaxStudents;
CloOpe_ClosedOrOpen_t Open; CloOpe_ClosedOrOpen_t ClosedOrOpen;
bool FileZones; bool FileZones;
bool AllGrps; // All groups selected? bool AllGrps; // All groups selected?
struct ListCodGrps LstGrpsSel; struct ListCodGrps LstGrpsSel;

View File

@ -38,16 +38,6 @@ const char HidVis_YN[HidVis_NUM_HIDDEN_VISIBLE] =
[HidVis_VISIBLE] = 'N', [HidVis_VISIBLE] = 'N',
}; };
const char *HidVis_DateGreenClass[HidVis_NUM_HIDDEN_VISIBLE] =
{
[HidVis_HIDDEN ] = "DATE_GREEN_LIGHT",
[HidVis_VISIBLE] = "DATE_GREEN",
};
const char *HidVis_DateRedClass[HidVis_NUM_HIDDEN_VISIBLE] =
{
[HidVis_HIDDEN ] = "DATE_RED_LIGHT",
[HidVis_VISIBLE] = "DATE_RED",
};
const char *HidVis_DateBlueClass[HidVis_NUM_HIDDEN_VISIBLE] = const char *HidVis_DateBlueClass[HidVis_NUM_HIDDEN_VISIBLE] =
{ {
[HidVis_HIDDEN ] = "DATE_BLUE_LIGHT", [HidVis_HIDDEN ] = "DATE_BLUE_LIGHT",
@ -98,4 +88,3 @@ HidVis_HiddenOrVisible_t HidVid_GetHiddenOrVisible (char Ch)
return (Ch == 'Y') ? HidVis_HIDDEN : return (Ch == 'Y') ? HidVis_HIDDEN :
HidVis_VISIBLE; HidVis_VISIBLE;
} }

View File

@ -44,6 +44,6 @@ typedef enum
/****************************** Public prototypes ****************************/ /****************************** Public prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
HidVis_HiddenOrVisible_t HidVid_GetHiddenOrVisible (char c); HidVis_HiddenOrVisible_t HidVid_GetHiddenOrVisible (char Ch);
#endif #endif

View File

@ -250,64 +250,56 @@ Ico_IconSet_t Ico_GetIconSetFromStr (const char *Str)
void Ico_PutContextualIconToAdd (Act_Action_t NextAction,const char *Anchor, void Ico_PutContextualIconToAdd (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor, Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,FuncPars,Args,
FuncPars,Args,
"plus.svg",Ico_BLACK); "plus.svg",Ico_BLACK);
} }
void Ico_PutContextualIconToRemove (Act_Action_t NextAction,const char *Anchor, void Ico_PutContextualIconToRemove (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor, Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,FuncPars,Args,
FuncPars,Args,
"trash.svg",Ico_RED); "trash.svg",Ico_RED);
} }
void Ico_PutContextualIconToReset (Act_Action_t NextAction,const char *Anchor, void Ico_PutContextualIconToReset (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor, Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,FuncPars,Args,
FuncPars,Args,
"recycle.svg",Ico_RED); "recycle.svg",Ico_RED);
} }
void Ico_PutContextualIconToUpdate (Act_Action_t NextAction,const char *Anchor, void Ico_PutContextualIconToUpdate (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor, Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,FuncPars,Args,
FuncPars,Args,
"recycle.svg",Ico_BLACK); "recycle.svg",Ico_BLACK);
} }
void Ico_PutContextualIconToEdit (Act_Action_t NextAction,const char *Anchor, void Ico_PutContextualIconToEdit (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor, Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,FuncPars,Args,
FuncPars,Args,
"pen.svg",Ico_BLACK); "pen.svg",Ico_BLACK);
} }
void Ico_PutContextualIconToViewFiles (Act_Action_t NextAction, void Ico_PutContextualIconToViewFiles (Act_Action_t NextAction,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,NULL, Lay_PutContextualLinkOnlyIcon (NextAction,NULL,FuncPars,Args,
FuncPars,Args,
"folder-open.svg",Ico_BLACK); "folder-open.svg",Ico_BLACK);
} }
void Ico_PutContextualIconToView (Act_Action_t NextAction,const char *Anchor, void Ico_PutContextualIconToView (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor, Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,FuncPars,Args,
FuncPars,Args,
"list.svg",Ico_BLACK); "list.svg",Ico_BLACK);
} }
void Ico_PutContextualIconToConfigure (Act_Action_t NextAction,const char *Anchor, void Ico_PutContextualIconToConfigure (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor, Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,FuncPars,Args,
FuncPars,Args,
"cog.svg",Ico_BLACK); "cog.svg",Ico_BLACK);
} }
@ -325,91 +317,84 @@ void Ico_PutContextualIconToHideUnhide (Act_Action_t NextAction[HidVis_NUM_HIDDE
void Ico_PutContextualIconToExpand (Act_Action_t NextAction,const char *Anchor, void Ico_PutContextualIconToExpand (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor, Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,FuncPars,Args,
FuncPars,Args,
"caret-right.svg",Ico_BLACK); "caret-right.svg",Ico_BLACK);
} }
void Ico_PutContextualIconToContract (Act_Action_t NextAction,const char *Anchor, void Ico_PutContextualIconToContract (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor, Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,FuncPars,Args,
FuncPars,Args,
"caret-down.svg",Ico_BLACK); "caret-down.svg",Ico_BLACK);
} }
void Ico_PutContextualIconToPrint (Act_Action_t NextAction, void Ico_PutContextualIconToPrint (Act_Action_t NextAction,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,NULL, Lay_PutContextualLinkOnlyIcon (NextAction,NULL,FuncPars,Args,
FuncPars,Args,
"print.svg",Ico_BLACK); "print.svg",Ico_BLACK);
} }
void Ico_PutContextualIconToGetLink (Act_Action_t NextAction,const char *Anchor, void Ico_PutContextualIconToGetLink (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor, Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,FuncPars,Args,
FuncPars,Args,
"link.svg",Ico_BLACK); "link.svg",Ico_BLACK);
} }
void Ico_PutContextualIconToCopy (Act_Action_t NextAction, void Ico_PutContextualIconToCopy (Act_Action_t NextAction,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,NULL, Lay_PutContextualLinkOnlyIcon (NextAction,NULL,FuncPars,Args,
FuncPars,Args,
"copy.svg",Ico_BLACK); "copy.svg",Ico_BLACK);
} }
void Ico_PutContextualIconToViewClipboard (Act_Action_t NextAction,const char *Anchor, void Ico_PutContextualIconToViewClipboard (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor, Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,FuncPars,Args,
FuncPars,Args,
"clipboard.svg",Ico_BLACK); "clipboard.svg",Ico_BLACK);
} }
void Ico_PutContextualIconToPaste (Act_Action_t NextAction, void Ico_PutContextualIconToPaste (Act_Action_t NextAction,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,NULL, Lay_PutContextualLinkOnlyIcon (NextAction,NULL,FuncPars,Args,
FuncPars,Args,
"paste.svg",Ico_BLACK); "paste.svg",Ico_BLACK);
} }
void Ico_PutContextualIconToCreateInFolder (Act_Action_t NextAction, void Ico_PutContextualIconToCreateInFolder (Act_Action_t NextAction,
void (*FuncPars) (void *Args),void *Args, void (*FuncPars) (void *Args),void *Args,
CloOpe_ClosedOrOpen_t Open) CloOpe_ClosedOrOpen_t ClosedOrOpen)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,NULL, static const char *CloOpe_Icon[CloOpe_NUM_CLOSED_OPEN] =
FuncPars,Args, {
Open == CloOpe_OPEN ? "folder-open-yellow-plus.png" : [CloOpe_CLOSED] = "folder-closed-yellow-plus.png",
"folder-yellow-plus.png", [CloOpe_OPEN ] = "folder-open-yellow-plus.png",
Ico_UNCHANGED); };
Lay_PutContextualLinkOnlyIcon (NextAction,NULL,FuncPars,Args,
CloOpe_Icon[ClosedOrOpen],Ico_UNCHANGED);
} }
void Ico_PutContextualIconToShowResults (Act_Action_t NextAction,const char *Anchor, void Ico_PutContextualIconToShowResults (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor, Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,FuncPars,Args,
FuncPars,Args,
"trophy.svg",Ico_BLACK); "trophy.svg",Ico_BLACK);
} }
void Ico_PutContextualIconToShowAttendanceList (Act_Action_t NextAction, void Ico_PutContextualIconToShowAttendanceList (Act_Action_t NextAction,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,NULL, Lay_PutContextualLinkOnlyIcon (NextAction,NULL,FuncPars,Args,
FuncPars,Args,
"tasks.svg",Ico_BLACK); "tasks.svg",Ico_BLACK);
} }
void Ico_PutContextualIconToZIP (Act_Action_t NextAction, void Ico_PutContextualIconToZIP (Act_Action_t NextAction,
void (*FuncPars) (void *Args),void *Args) void (*FuncPars) (void *Args),void *Args)
{ {
Lay_PutContextualLinkOnlyIcon (NextAction,NULL, Lay_PutContextualLinkOnlyIcon (NextAction,NULL,FuncPars,Args,
FuncPars,Args,
"download.svg",Ico_BLACK); "download.svg",Ico_BLACK);
} }

View File

@ -114,7 +114,7 @@ void Ico_PutContextualIconToPaste (Act_Action_t NextAction,
void (*FuncPars) (void *Args),void *Args); void (*FuncPars) (void *Args),void *Args);
void Ico_PutContextualIconToCreateInFolder (Act_Action_t NextAction, void Ico_PutContextualIconToCreateInFolder (Act_Action_t NextAction,
void (*FuncPars) (void *Args),void *Args, void (*FuncPars) (void *Args),void *Args,
CloOpe_ClosedOrOpen_t Open); CloOpe_ClosedOrOpen_t ClosedOrOpen);
void Ico_PutContextualIconToShowResults (Act_Action_t NextAction,const char *Anchor, void Ico_PutContextualIconToShowResults (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args); void (*FuncPars) (void *Args),void *Args);
void Ico_PutContextualIconToShowAttendanceList (Act_Action_t NextAction, void Ico_PutContextualIconToShowAttendanceList (Act_Action_t NextAction,

View File

@ -131,7 +131,8 @@ void Map_AddMarker (const struct Map_Coordinates *Coord)
/************************* Add a marker to our map ***************************/ /************************* Add a marker to our map ***************************/
/*****************************************************************************/ /*****************************************************************************/
void Map_AddPopup (const char *Title,const char *Subtitle,CloOpe_ClosedOrOpen_t Open) void Map_AddPopup (const char *Title,const char *Subtitle,
CloOpe_ClosedOrOpen_t ClosedOrOpen)
{ {
/* The bindPopup method attaches a popup with the specified HTML content /* The bindPopup method attaches a popup with the specified HTML content
to your marker so the popup appears when you click on the object, to your marker so the popup appears when you click on the object,
@ -140,7 +141,7 @@ void Map_AddPopup (const char *Title,const char *Subtitle,CloOpe_ClosedOrOpen_t
HTM_TxtF ("\t" HTM_TxtF ("\t"
"marker.bindPopup(\"<strong>%s</strong><br />%s\")", "marker.bindPopup(\"<strong>%s</strong><br />%s\")",
Title,Subtitle); Title,Subtitle);
if (Open == CloOpe_OPEN) if (ClosedOrOpen == CloOpe_OPEN)
HTM_Txt (".openPopup()"); HTM_Txt (".openPopup()");
HTM_Txt (";\n"); HTM_Txt (";\n");
} }

View File

@ -52,7 +52,8 @@ void Map_CreateMap (const char *ContainerId,
const struct Map_Coordinates *Coord,unsigned Zoom); const struct Map_Coordinates *Coord,unsigned Zoom);
void Map_AddTileLayer (void); void Map_AddTileLayer (void);
void Map_AddMarker (const struct Map_Coordinates *Coord); void Map_AddMarker (const struct Map_Coordinates *Coord);
void Map_AddPopup (const char *Title,const char *Subtitle,CloOpe_ClosedOrOpen_t Open); void Map_AddPopup (const char *Title,const char *Subtitle,
CloOpe_ClosedOrOpen_t ClosedOrOpen);
void Map_GetCoordAndZoom (struct Map_Coordinates *Coord,unsigned *Zoom, void Map_GetCoordAndZoom (struct Map_Coordinates *Coord,unsigned *Zoom,
const char *Query); const char *Query);
double Map_GetLatitudeFromStr (char *Str); double Map_GetLatitudeFromStr (char *Str);

View File

@ -154,7 +154,8 @@ static void Msg_GetMsgContent (long MsgCod,
static void Msg_WriteSentOrReceivedMsgSubject (struct Msg_Messages *Messages, static void Msg_WriteSentOrReceivedMsgSubject (struct Msg_Messages *Messages,
long MsgCod,const char *Subject, long MsgCod,const char *Subject,
CloOpe_ClosedOrOpen_t Open,bool Expanded); CloOpe_ClosedOrOpen_t ClosedOrOpen,
bool Expanded);
static bool Msg_WriteCrsOrgMsg (long CrsCod); static bool Msg_WriteCrsOrgMsg (long CrsCod);
@ -2006,8 +2007,44 @@ static void Msg_ShowASentOrReceivedMessage (struct Msg_Messages *Messages,
[Msg_RECEIVED] = ActDelRcvMsg, [Msg_RECEIVED] = ActDelRcvMsg,
[Msg_SENT ] = ActDelSntMsg, [Msg_SENT ] = ActDelSntMsg,
}; };
static const char *Class[Msg_NUM_TYPES_OF_MSGS][CloOpe_NUM_CLOSED_OPEN] =
{
[Msg_RECEIVED][CloOpe_CLOSED] = "MSG_BG_NEW",
[Msg_RECEIVED][CloOpe_OPEN ] = "MSG_BG",
[Msg_SENT ][CloOpe_CLOSED] = "MSG_BG",
[Msg_SENT ][CloOpe_OPEN ] = "MSG_BG",
};
static struct
{
const char *Icon;
const char **Title;
} Icons[Msg_NUM_TYPES_OF_MSGS][CloOpe_NUM_CLOSED_OPEN][2] =
{
[Msg_RECEIVED][CloOpe_CLOSED][false] = {"envelope.svg" ,&Txt_MSG_Unopened },
[Msg_RECEIVED][CloOpe_CLOSED][true ] = {"envelope.svg" ,&Txt_MSG_Unopened },
[Msg_RECEIVED][CloOpe_OPEN ][false] = {"envelope-open-text.svg",&Txt_MSG_Not_replied},
[Msg_RECEIVED][CloOpe_OPEN ][true ] = {"reply.svg" ,&Txt_MSG_Replied },
[Msg_SENT ][CloOpe_CLOSED][false] = {"share.svg" ,&Txt_MSG_Sent },
[Msg_SENT ][CloOpe_CLOSED][true ] = {"share.svg" ,&Txt_MSG_Sent },
[Msg_SENT ][CloOpe_OPEN ][false] = {"share.svg" ,&Txt_MSG_Sent },
[Msg_SENT ][CloOpe_OPEN ][true ] = {"share.svg" ,&Txt_MSG_Sent },
};
static const char *ClassAuthor[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = "MSG_AUT_NEW",
[CloOpe_OPEN ] = "MSG_AUT",
};
static const char *ClassDateTime[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = "MSG_TIT_NEW",
[CloOpe_OPEN ] = "MSG_TIT",
};
static const char *ClassBg[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = "MSG_BG_NEW",
[CloOpe_OPEN ] = "MSG_BG",
};
struct Usr_Data UsrDat; struct Usr_Data UsrDat;
const char *Title = NULL; // Initialized to avoid warning
bool FromThisCrs = false; // Initialized to avoid warning bool FromThisCrs = false; // Initialized to avoid warning
time_t CreatTimeUTC; // Creation time of a message time_t CreatTimeUTC; // Creation time of a message
long CrsCod; long CrsCod;
@ -2015,7 +2052,7 @@ static void Msg_ShowASentOrReceivedMessage (struct Msg_Messages *Messages,
char Content[Cns_MAX_BYTES_LONG_TEXT + 1]; char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
struct Med_Media Media; struct Med_Media Media;
bool Deleted; bool Deleted;
CloOpe_ClosedOrOpen_t Open = CloOpe_OPEN; CloOpe_ClosedOrOpen_t ClosedOrOpen = CloOpe_OPEN;
bool Replied = false; // Initialized to avoid warning bool Replied = false; // Initialized to avoid warning
bool Expanded = false; bool Expanded = false;
@ -2027,45 +2064,29 @@ static void Msg_ShowASentOrReceivedMessage (struct Msg_Messages *Messages,
switch (Messages->TypeOfMessages) switch (Messages->TypeOfMessages)
{ {
case Msg_RECEIVED: case Msg_RECEIVED:
Msg_DB_GetStatusOfRcvMsg (MsgCod,&Open,&Replied,&Expanded); Msg_DB_GetStatusOfRcvMsg (MsgCod,&ClosedOrOpen,&Replied,&Expanded);
break; break;
case Msg_SENT: case Msg_SENT:
Expanded = Msg_DB_GetStatusOfSntMsg (MsgCod); Expanded = Msg_DB_GetStatusOfSntMsg (MsgCod);
break; break;
default: default:
Err_WrongMessageExit ();
break; break;
} }
/***** Put an icon with message status *****/ /***** Put an icon with message status *****/
switch (Messages->TypeOfMessages)
{
case Msg_RECEIVED:
Title = (Open == CloOpe_OPEN ? (Replied ? Txt_MSG_Replied :
Txt_MSG_Not_replied) :
Txt_MSG_Unopened);
break;
case Msg_SENT:
Title = Txt_MSG_Sent;
break;
default:
break;
}
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
/***** Icons *****/ /***** Icons *****/
HTM_TD_Begin ("class=\"CONTEXT_COL %s_%s\"", HTM_TD_Begin ("class=\"CONTEXT_COL %s_%s\"",
Messages->TypeOfMessages == Msg_RECEIVED ? (Open == CloOpe_OPEN ? "MSG_BG" : Class[Messages->TypeOfMessages][ClosedOrOpen],
"MSG_BG_NEW") :
"MSG_BG",
The_GetSuffix ()); The_GetSuffix ());
/* Type of message icon (envelope, reply...) */ /* Type of message icon (envelope, reply...) */
Ico_PutIcon (Messages->TypeOfMessages == Msg_RECEIVED ? (Open == CloOpe_OPEN ? (Replied ? "reply.svg" : Ico_PutIcon (Icons[Messages->TypeOfMessages][ClosedOrOpen][Replied].Icon,
"envelope-open-text.svg") : Ico_BLACK,
"envelope.svg") : *Icons[Messages->TypeOfMessages][ClosedOrOpen][Replied].Title,
"share.svg", "ICO16x16");
Ico_BLACK,Title,"ICO16x16");
HTM_BR (); HTM_BR ();
@ -2076,14 +2097,12 @@ static void Msg_ShowASentOrReceivedMessage (struct Msg_Messages *Messages,
HTM_TD_End (); HTM_TD_End ();
/***** Number *****/ /***** Number *****/
Msg_WriteMsgNumber (MsgNum,Open == CloOpe_CLOSED); Msg_WriteMsgNumber (MsgNum,ClosedOrOpen == CloOpe_CLOSED);
/***** Author *****/ /***** Author *****/
HTM_TD_Begin ("class=\"LT %s_%s %s_%s\"", HTM_TD_Begin ("class=\"LT %s_%s %s_%s\"",
Open == CloOpe_OPEN ? "MSG_AUT" : ClassAuthor[ClosedOrOpen],The_GetSuffix (),
"MSG_AUT_NEW",The_GetSuffix (), ClassBg[ClosedOrOpen],The_GetSuffix ());
Open == CloOpe_OPEN ? "MSG_BG" :
"MSG_BG_NEW",The_GetSuffix ());
Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat,
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CRS); Usr_DONT_GET_ROLE_IN_CRS);
@ -2091,14 +2110,12 @@ static void Msg_ShowASentOrReceivedMessage (struct Msg_Messages *Messages,
HTM_TD_End (); HTM_TD_End ();
/***** Subject *****/ /***** Subject *****/
Msg_WriteSentOrReceivedMsgSubject (Messages,MsgCod,Subject,Open,Expanded); Msg_WriteSentOrReceivedMsgSubject (Messages,MsgCod,Subject,ClosedOrOpen,Expanded);
/***** Date-time *****/ /***** Date-time *****/
Msg_WriteMsgDate (CreatTimeUTC, Msg_WriteMsgDate (CreatTimeUTC,
Open == CloOpe_OPEN ? "MSG_TIT" : ClassDateTime[ClosedOrOpen],
"MSG_TIT_NEW", ClassBg[ClosedOrOpen]);
Open == CloOpe_OPEN ? "MSG_BG" :
"MSG_BG_NEW");
HTM_TR_End (); HTM_TR_End ();
@ -2249,30 +2266,48 @@ void Msg_WriteMsgNumber (unsigned long MsgNum,bool NewMsg)
static void Msg_WriteSentOrReceivedMsgSubject (struct Msg_Messages *Messages, static void Msg_WriteSentOrReceivedMsgSubject (struct Msg_Messages *Messages,
long MsgCod,const char *Subject, long MsgCod,const char *Subject,
CloOpe_ClosedOrOpen_t Open,bool Expanded) CloOpe_ClosedOrOpen_t ClosedOrOpen,
bool Expanded)
{ {
extern const char *Txt_Hide_message;
extern const char *Txt_See_message; extern const char *Txt_See_message;
extern const char *Txt_Hide_message;
extern const char *Txt_no_subject; extern const char *Txt_no_subject;
static const char *ClassSubject[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = "MSG_TIT_NEW",
[CloOpe_OPEN ] = "MSG_TIT",
};
static const char *ClassBg[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = "MSG_BG_NEW",
[CloOpe_OPEN ] = "MSG_BG",
};
static Act_Action_t Action[Msg_NUM_TYPES_OF_MSGS][2] =
{
[Msg_WRITING ][false] = ActUnk,
[Msg_WRITING ][true ] = ActUnk,
[Msg_RECEIVED][false] = ActExpRcvMsg,
[Msg_RECEIVED][true ] = ActConRcvMsg,
[Msg_SENT ][false] = ActExpSntMsg,
[Msg_SENT ][true ] = ActConSntMsg,
};
static const char **Title[2] =
{
[false] = &Txt_See_message,
[true ] = &Txt_Hide_message,
};
/***** Begin cell *****/ /***** Begin cell *****/
HTM_TD_Begin ("class=\"LT %s_%s %s_%s\"", HTM_TD_Begin ("class=\"LT %s_%s %s_%s\"",
Open == CloOpe_OPEN ? "MSG_TIT" : ClassSubject[ClosedOrOpen],The_GetSuffix (),
"MSG_TIT_NEW",The_GetSuffix (), ClassBg[ClosedOrOpen],The_GetSuffix ());
Open == CloOpe_OPEN ? "MSG_BG" :
"MSG_BG_NEW" ,The_GetSuffix ());
/***** Begin form to expand/contract the message *****/ /***** Begin form to expand/contract the message *****/
Frm_BeginForm (Messages->TypeOfMessages == Msg_RECEIVED ? (Expanded ? ActConRcvMsg : Frm_BeginForm (Action[Messages->TypeOfMessages][Expanded]);
ActExpRcvMsg) :
(Expanded ? ActConSntMsg :
ActExpSntMsg));
Messages->MsgCod = MsgCod; // Message to be contracted/expanded Messages->MsgCod = MsgCod; // Message to be contracted/expanded
Msg_PutParsOneMsg (Messages); Msg_PutParsOneMsg (Messages);
HTM_BUTTON_Submit_Begin (Expanded ? Txt_Hide_message : HTM_BUTTON_Submit_Begin (*Title[Expanded],"class=\"LT BT_LINK\"");
Txt_See_message,
"class=\"LT BT_LINK\"");
/***** Write subject *****/ /***** Write subject *****/
if (Subject[0]) if (Subject[0])

View File

@ -726,8 +726,8 @@ bool Msg_DB_GetStatusOfSntMsg (long MsgCod)
/********* Get if a received message has been open/replied/expanded **********/ /********* Get if a received message has been open/replied/expanded **********/
/*****************************************************************************/ /*****************************************************************************/
void Msg_DB_GetStatusOfRcvMsg (long MsgCod, void Msg_DB_GetStatusOfRcvMsg (long MsgCod,CloOpe_ClosedOrOpen_t *ClosedOrOpen,
CloOpe_ClosedOrOpen_t *Open,bool *Replied,bool *Expanded) bool *Replied,bool *Expanded)
{ {
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
@ -751,10 +751,9 @@ void Msg_DB_GetStatusOfRcvMsg (long MsgCod,
/***** Get if message has been read by me (row[0]), /***** Get if message has been read by me (row[0]),
if message has been replied (row[1]), and if message has been replied (row[1]), and
if message is expanded (row[2]) *****/ if message is expanded (row[2]) *****/
*Open = (row[0][0] == 'Y') ? CloOpe_OPEN : *ClosedOrOpen = CloOpe_GetClosedOrOpenFromYN (row[0][0]);
CloOpe_CLOSED; *Replied = (row[1][0] == 'Y');
*Replied = (row[1][0] == 'Y'); *Expanded = (row[2][0] == 'Y');
*Expanded = (row[2][0] == 'Y');
/***** Free structure that stores the query result *****/ /***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res); DB_FreeMySQLResult (&mysql_res);

View File

@ -69,8 +69,8 @@ void Msg_DB_GetMsgSubject (long MsgCod,char Subject[Cns_MAX_BYTES_SUBJECT + 1]);
unsigned Msg_DB_GetMsgContent (MYSQL_RES **mysql_res,long MsgCod); unsigned Msg_DB_GetMsgContent (MYSQL_RES **mysql_res,long MsgCod);
unsigned Msg_DB_GetMsgSntData (MYSQL_RES **mysql_res,long MsgCod,bool *Deleted); unsigned Msg_DB_GetMsgSntData (MYSQL_RES **mysql_res,long MsgCod,bool *Deleted);
bool Msg_DB_GetStatusOfSntMsg (long MsgCod); bool Msg_DB_GetStatusOfSntMsg (long MsgCod);
void Msg_DB_GetStatusOfRcvMsg (long MsgCod, void Msg_DB_GetStatusOfRcvMsg (long MsgCod,CloOpe_ClosedOrOpen_t *Open,
CloOpe_ClosedOrOpen_t *Open,bool *Replied,bool *Expanded); bool *Replied,bool *Expanded);
bool Msg_DB_CheckIfSntMsgIsDeleted (long MsgCod); bool Msg_DB_CheckIfSntMsgIsDeleted (long MsgCod);
bool Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (long MsgCod); bool Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (long MsgCod);
long Msg_DB_GetSender (long MsgCod); long Msg_DB_GetSender (long MsgCod);

View File

@ -415,6 +415,7 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
long SelectedItmCod, long SelectedItmCod,
long SelectedRscCod) long SelectedRscCod)
{ {
extern const char *CloOpe_Class[CloOpe_NUM_CLOSED_OPEN][HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_PrgClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_PrgClass[HidVis_NUM_HIDDEN_VISIBLE];
static unsigned UniqueId = 0; static unsigned UniqueId = 0;
static Vie_ViewType_t ViewingOrEditingProgram[Prg_NUM_LISTING_TYPES] = static Vie_ViewType_t ViewingOrEditingProgram[Prg_NUM_LISTING_TYPES] =
@ -557,9 +558,7 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
HTM_DIV_Begin ("id=\"%s\" class=\"%s_%s%s\"", HTM_DIV_Begin ("id=\"%s\" class=\"%s_%s%s\"",
Id, Id,
Item->Open == CloOpe_OPEN ? "DATE_GREEN" : CloOpe_Class[Item->ClosedOrOpen][HidVis_VISIBLE],The_GetSuffix (),
"DATE_RED",
The_GetSuffix (),
HidVis_PrgClass[HiddenOrVisible]); HidVis_PrgClass[HiddenOrVisible]);
Dat_WriteLocalDateHMSFromUTC (Id,Item->TimeUTC[StartEndTime], Dat_WriteLocalDateHMSFromUTC (Id,Item->TimeUTC[StartEndTime],
Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA, Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA,
@ -1223,8 +1222,7 @@ static void Prg_GetItemDataFromRow (MYSQL_RES **mysql_res,
Item->TimeUTC[Dat_END_TIME] = Dat_GetUNIXTimeFromStr (row[6]); Item->TimeUTC[Dat_END_TIME] = Dat_GetUNIXTimeFromStr (row[6]);
/* Get whether the program item is open or closed (row(7)) */ /* Get whether the program item is open or closed (row(7)) */
Item->Open = (row[7][0] == '1') ? CloOpe_OPEN : Item->ClosedOrOpen = CloOpe_GetClosedOrOpenFrom01 (row[7][0]);
CloOpe_CLOSED;
/* Get the title of the program item (row[8]) */ /* Get the title of the program item (row[8]) */
Str_Copy (Item->Title,row[8],sizeof (Item->Title) - 1); Str_Copy (Item->Title,row[8],sizeof (Item->Title) - 1);
@ -1266,7 +1264,7 @@ void Prg_ResetItem (struct Prg_Item *Item)
Item->UsrCod = -1L; Item->UsrCod = -1L;
Item->TimeUTC[Dat_STR_TIME] = Item->TimeUTC[Dat_STR_TIME] =
Item->TimeUTC[Dat_END_TIME] = (time_t) 0; Item->TimeUTC[Dat_END_TIME] = (time_t) 0;
Item->Open = CloOpe_CLOSED; Item->ClosedOrOpen = CloOpe_CLOSED;
Item->Title[0] = '\0'; Item->Title[0] = '\0';
Prg_ResetResource (Item); Prg_ResetResource (Item);
} }
@ -1895,7 +1893,7 @@ static void Prg_ShowFormToCreateItem (long ParentItmCod)
Prg_ResetItem (&Item); Prg_ResetItem (&Item);
Item.TimeUTC[Dat_STR_TIME] = Dat_GetStartExecutionTimeUTC (); Item.TimeUTC[Dat_STR_TIME] = Dat_GetStartExecutionTimeUTC ();
Item.TimeUTC[Dat_END_TIME] = Item.TimeUTC[Dat_STR_TIME] + (2 * 60 * 60); // +2 hours Item.TimeUTC[Dat_END_TIME] = Item.TimeUTC[Dat_STR_TIME] + (2 * 60 * 60); // +2 hours
Item.Open = CloOpe_OPEN; Item.ClosedOrOpen = CloOpe_OPEN;
/***** Show pending alerts */ /***** Show pending alerts */
Ale_ShowAlerts (NULL); Ale_ShowAlerts (NULL);

View File

@ -62,7 +62,7 @@ struct Prg_Item
unsigned NumItem; unsigned NumItem;
long UsrCod; long UsrCod;
time_t TimeUTC[Dat_NUM_START_END_TIME]; time_t TimeUTC[Dat_NUM_START_END_TIME];
CloOpe_ClosedOrOpen_t Open; CloOpe_ClosedOrOpen_t ClosedOrOpen;
char Title[Prg_MAX_BYTES_PROGRAM_ITEM_TITLE + 1]; char Title[Prg_MAX_BYTES_PROGRAM_ITEM_TITLE + 1];
struct struct
{ {

View File

@ -389,8 +389,7 @@ void Svy_SeeOneSurvey (void)
static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys, static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
bool ShowOnlyThisSvyComplete) bool ShowOnlyThisSvyComplete)
{ {
extern const char *HidVis_DateGreenClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *CloOpe_Class[CloOpe_NUM_CLOSED_OPEN][HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_DateRedClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_TitleClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_TitleClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_GroupClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_GroupClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_DataClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_DataClass[HidVis_NUM_HIDDEN_VISIBLE];
@ -450,16 +449,13 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
if (ShowOnlyThisSvyComplete) if (ShowOnlyThisSvyComplete)
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"", HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"",
Id, Id,
Surveys->Svy.Status.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] : CloOpe_Class[Surveys->Svy.Status.ClosedOrOpen][Surveys->Svy.Status.HiddenOrVisible],
HidVis_DateRedClass[Surveys->Svy.Status.HiddenOrVisible],
The_GetSuffix ()); The_GetSuffix ());
else else
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"", HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
Id, Id,
Surveys->Svy.Status.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] : CloOpe_Class[Surveys->Svy.Status.ClosedOrOpen][Surveys->Svy.Status.HiddenOrVisible],
HidVis_DateRedClass[Surveys->Svy.Status.HiddenOrVisible], The_GetSuffix (),The_GetColorRows ());
The_GetSuffix (),
The_GetColorRows ());
Dat_WriteLocalDateHMSFromUTC (Id,Surveys->Svy.TimeUTC[Dat_STR_TIME], Dat_WriteLocalDateHMSFromUTC (Id,Surveys->Svy.TimeUTC[Dat_STR_TIME],
Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK, Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK,
true,true,true,0x7); true,true,true,0x7);
@ -472,14 +468,12 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
if (ShowOnlyThisSvyComplete) if (ShowOnlyThisSvyComplete)
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"", HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"",
Id, Id,
Surveys->Svy.Status.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] : CloOpe_Class[Surveys->Svy.Status.ClosedOrOpen][Surveys->Svy.Status.HiddenOrVisible],
HidVis_DateRedClass[Surveys->Svy.Status.HiddenOrVisible],
The_GetSuffix ()); The_GetSuffix ());
else else
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"", HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
Id, Id,
Surveys->Svy.Status.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] : CloOpe_Class[Surveys->Svy.Status.ClosedOrOpen][Surveys->Svy.Status.HiddenOrVisible],
HidVis_DateRedClass[Surveys->Svy.Status.HiddenOrVisible],
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
Dat_WriteLocalDateHMSFromUTC (Id,Surveys->Svy.TimeUTC[Dat_END_TIME], Dat_WriteLocalDateHMSFromUTC (Id,Surveys->Svy.TimeUTC[Dat_END_TIME],
@ -695,6 +689,7 @@ static void Svy_WriteAuthor (struct Svy_Survey *Svy)
static void Svy_WriteStatus (struct Svy_Survey *Svy) static void Svy_WriteStatus (struct Svy_Survey *Svy)
{ {
extern const char *CloOpe_Class[CloOpe_NUM_CLOSED_OPEN][HidVis_NUM_HIDDEN_VISIBLE];
extern const char *Txt_Hidden_survey; extern const char *Txt_Hidden_survey;
extern const char *Txt_Visible_survey; extern const char *Txt_Visible_survey;
extern const char *Txt_Closed_survey; extern const char *Txt_Closed_survey;
@ -705,104 +700,79 @@ static void Svy_WriteStatus (struct Svy_Survey *Svy)
extern const char *Txt_SURVEY_You_dont_belong_to_the_scope_of_the_survey; extern const char *Txt_SURVEY_You_dont_belong_to_the_scope_of_the_survey;
extern const char *Txt_SURVEY_You_have_already_answered; extern const char *Txt_SURVEY_You_have_already_answered;
extern const char *Txt_SURVEY_You_have_not_answered; extern const char *Txt_SURVEY_You_have_not_answered;
extern const char *HidVis_DateGreenClass[HidVis_NUM_HIDDEN_VISIBLE]; static const char *HiddenOrVisibleClass[HidVis_NUM_HIDDEN_VISIBLE] =
extern const char *HidVis_DateRedClass[HidVis_NUM_HIDDEN_VISIBLE];
static struct
{ {
const char **Class; [HidVis_HIDDEN ] = "DATE_RED_LIGHT",
const char **Txt; [HidVis_VISIBLE] = "DATE_GREEN",
} HiddenOrVisible[HidVis_NUM_HIDDEN_VISIBLE] =
{
[HidVis_HIDDEN ] =
{
.Class = &HidVis_DateRedClass [HidVis_HIDDEN ],
.Txt = &Txt_Hidden_survey
},
[HidVis_VISIBLE] =
{
.Class = &HidVis_DateGreenClass[HidVis_VISIBLE],
.Txt = &Txt_Visible_survey
}
}; };
static const char **HiddenOrVisibleTxt[HidVis_NUM_HIDDEN_VISIBLE] =
{
[HidVis_HIDDEN ] = &Txt_Hidden_survey,
[HidVis_VISIBLE] = &Txt_Visible_survey,
};
static const char **ClosedOrOpenTxt[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = &Txt_Closed_survey,
[CloOpe_OPEN ] = &Txt_Open_survey,
};
static const char **ClosedOrOpenDependingOnMyRoleTxt[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = &Txt_SURVEY_Type_of_user_not_allowed,
[CloOpe_OPEN ] = &Txt_SURVEY_Type_of_user_allowed,
};
static const char **ClosedOrOpenDependingOnScopeTxt[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = &Txt_SURVEY_You_dont_belong_to_the_scope_of_the_survey,
[CloOpe_OPEN ] = &Txt_SURVEY_You_belong_to_the_scope_of_the_survey,
};
static const char **ClosedOrOpenDependingOnAlreadyAnsweredTxt[CloOpe_NUM_CLOSED_OPEN] =
{
[CloOpe_CLOSED] = &Txt_SURVEY_You_have_already_answered,
[CloOpe_OPEN ] = &Txt_SURVEY_You_have_not_answered,
};
CloOpe_ClosedOrOpen_t ClosedOrOpenDependingOnMyRole = Svy->Status.IAmLoggedWithAValidRoleToAnswer ? CloOpe_OPEN :
CloOpe_CLOSED;
CloOpe_ClosedOrOpen_t ClosedOrOpenDependingOnScope = Svy->Status.IBelongToScope ? CloOpe_OPEN :
CloOpe_CLOSED;
CloOpe_ClosedOrOpen_t ClosedOrOpenDependingOnAlreadyAnswered = Svy->Status.IHaveAnswered ? CloOpe_CLOSED :
CloOpe_OPEN;
/***** Begin list with items of status *****/ /***** Begin list with items of status *****/
HTM_UL_Begin (NULL); HTM_UL_Begin (NULL);
/* Write whether survey is visible or hidden */ /* Write whether survey is visible or hidden */
HTM_LI_Begin ("class=\"%s_%s\"", HTM_LI_Begin ("class=\"%s_%s\"",
*HiddenOrVisible[Svy->Status.HiddenOrVisible].Class, HiddenOrVisibleClass[Svy->Status.HiddenOrVisible],
The_GetSuffix ()); The_GetSuffix ());
HTM_Txt (*HiddenOrVisible[Svy->Status.HiddenOrVisible].Txt); HTM_Txt (*HiddenOrVisibleTxt[Svy->Status.HiddenOrVisible]);
HTM_LI_End (); HTM_LI_End ();
/* Write whether survey is open or closed */ /* Write whether survey is open or closed */
switch (Svy->Status.Open) HTM_LI_Begin ("class=\"%s_%s\"",
{ CloOpe_Class[Svy->Status.ClosedOrOpen][Svy->Status.HiddenOrVisible],
case CloOpe_OPEN: The_GetSuffix ());
HTM_LI_Begin ("class=\"%s_%s\"", HTM_Txt (*ClosedOrOpenTxt[Svy->Status.ClosedOrOpen]);
HidVis_DateGreenClass[Svy->Status.HiddenOrVisible],
The_GetSuffix ());
HTM_Txt (Txt_Open_survey);
break;
case CloOpe_CLOSED:
default:
HTM_LI_Begin ("class=\"%s_%s\"",
HidVis_DateRedClass[Svy->Status.HiddenOrVisible],
The_GetSuffix ());
HTM_Txt (Txt_Closed_survey);
break;
}
HTM_LI_End (); HTM_LI_End ();
/* Write whether survey can be answered by me or not depending on user type */ /* Write whether survey can be answered by me or not depending on my role */
if (Svy->Status.IAmLoggedWithAValidRoleToAnswer) HTM_LI_Begin ("class=\"%s_%s\"",
{ CloOpe_Class[ClosedOrOpenDependingOnMyRole][Svy->Status.HiddenOrVisible],
HTM_LI_Begin ("class=\"%s_%s\"", The_GetSuffix ());
HidVis_DateGreenClass[Svy->Status.HiddenOrVisible], HTM_Txt (*ClosedOrOpenDependingOnMyRoleTxt[ClosedOrOpenDependingOnMyRole]);
The_GetSuffix ());
HTM_Txt (Txt_SURVEY_Type_of_user_allowed);
}
else
{
HTM_LI_Begin ("class=\"%s_%s\"",
HidVis_DateRedClass[Svy->Status.HiddenOrVisible],
The_GetSuffix ());
HTM_Txt (Txt_SURVEY_Type_of_user_not_allowed);
}
HTM_LI_End (); HTM_LI_End ();
/* Write whether survey can be answered by me or not depending on groups */ /* Write whether survey can be answered by me or not depending on groups */
if (Svy->Status.IBelongToScope) HTM_LI_Begin ("class=\"%s_%s\"",
{ CloOpe_Class[ClosedOrOpenDependingOnScope][Svy->Status.HiddenOrVisible],
HTM_LI_Begin ("class=\"%s_%s\"", The_GetSuffix ());
HidVis_DateGreenClass[Svy->Status.HiddenOrVisible], HTM_Txt (*ClosedOrOpenDependingOnScopeTxt[ClosedOrOpenDependingOnScope]);
The_GetSuffix ());
HTM_Txt (Txt_SURVEY_You_belong_to_the_scope_of_the_survey);
}
else
{
HTM_LI_Begin ("class=\"%s_%s\"",
HidVis_DateRedClass[Svy->Status.HiddenOrVisible],
The_GetSuffix ());
HTM_Txt (Txt_SURVEY_You_dont_belong_to_the_scope_of_the_survey);
}
HTM_LI_End (); HTM_LI_End ();
/* Write whether survey has been already answered by me or not */ /* Write whether survey has been already answered by me or not */
if (Svy->Status.IHaveAnswered) HTM_LI_Begin ("class=\"%s_%s\"",
{ CloOpe_Class[ClosedOrOpenDependingOnAlreadyAnswered][Svy->Status.HiddenOrVisible],
HTM_LI_Begin ("class=\"%s_%s\"", The_GetSuffix ());
HidVis_DateGreenClass[Svy->Status.HiddenOrVisible], HTM_Txt (*ClosedOrOpenDependingOnAlreadyAnsweredTxt[ClosedOrOpenDependingOnAlreadyAnswered]);
The_GetSuffix ());
HTM_Txt (Txt_SURVEY_You_have_already_answered);
}
else
{
HTM_LI_Begin ("class=\"%s_%s\"",
HidVis_DateRedClass[Svy->Status.HiddenOrVisible],
The_GetSuffix ());
HTM_Txt (Txt_SURVEY_You_have_not_answered);
}
HTM_LI_End (); HTM_LI_End ();
/***** End list with items of status *****/ /***** End list with items of status *****/
@ -1136,8 +1106,7 @@ void Svy_GetSurveyDataByCod (struct Svy_Survey *Svy)
Svy->TimeUTC[Dat_END_TIME] = Dat_GetUNIXTimeFromStr (row[7]); Svy->TimeUTC[Dat_END_TIME] = Dat_GetUNIXTimeFromStr (row[7]);
/* Get whether the survey is open or closed (row(8)) */ /* Get whether the survey is open or closed (row(8)) */
Svy->Status.Open = (row[8][0] == '1') ? CloOpe_OPEN : Svy->Status.ClosedOrOpen = CloOpe_GetClosedOrOpenFrom01 (row[8][0]);
CloOpe_CLOSED;
/* Get the title of the survey (row[9]) */ /* Get the title of the survey (row[9]) */
Str_Copy (Svy->Title,row[9],sizeof (Svy->Title) - 1); Str_Copy (Svy->Title,row[9],sizeof (Svy->Title) - 1);
@ -1176,7 +1145,7 @@ void Svy_GetSurveyDataByCod (struct Svy_Survey *Svy)
/* Can I answer survey? */ /* Can I answer survey? */
Svy->Status.ICanAnswer = ( Svy->NumQsts != 0) && Svy->Status.ICanAnswer = ( Svy->NumQsts != 0) &&
Svy->Status.HiddenOrVisible == HidVis_VISIBLE && Svy->Status.HiddenOrVisible == HidVis_VISIBLE &&
Svy->Status.Open == CloOpe_OPEN && Svy->Status.ClosedOrOpen == CloOpe_OPEN &&
Svy->Status.IAmLoggedWithAValidRoleToAnswer && Svy->Status.IAmLoggedWithAValidRoleToAnswer &&
Svy->Status.IBelongToScope && Svy->Status.IBelongToScope &&
!Svy->Status.IHaveAnswered; !Svy->Status.IHaveAnswered;
@ -1194,7 +1163,7 @@ void Svy_GetSurveyDataByCod (struct Svy_Survey *Svy)
Svy->Level == Hie_SYS) && Svy->Level == Hie_SYS) &&
(Svy->NumQsts != 0) && (Svy->NumQsts != 0) &&
Svy->Status.HiddenOrVisible == HidVis_VISIBLE && Svy->Status.HiddenOrVisible == HidVis_VISIBLE &&
Svy->Status.Open == CloOpe_OPEN && Svy->Status.ClosedOrOpen == CloOpe_OPEN &&
Svy->Status.IAmLoggedWithAValidRoleToAnswer && Svy->Status.IAmLoggedWithAValidRoleToAnswer &&
Svy->Status.IBelongToScope && Svy->Status.IBelongToScope &&
Svy->Status.IHaveAnswered; Svy->Status.IHaveAnswered;
@ -1283,7 +1252,7 @@ void Svy_GetSurveyDataByCod (struct Svy_Survey *Svy)
Svy->NumQsts = 0; Svy->NumQsts = 0;
Svy->NumUsrs = 0; Svy->NumUsrs = 0;
Svy->Status.HiddenOrVisible = HidVis_VISIBLE; Svy->Status.HiddenOrVisible = HidVis_VISIBLE;
Svy->Status.Open = CloOpe_CLOSED; Svy->Status.ClosedOrOpen = CloOpe_CLOSED;
Svy->Status.IAmLoggedWithAValidRoleToAnswer = false; Svy->Status.IAmLoggedWithAValidRoleToAnswer = false;
Svy->Status.IBelongToScope = false; Svy->Status.IBelongToScope = false;
Svy->Status.IHaveAnswered = false; Svy->Status.IHaveAnswered = false;
@ -1608,7 +1577,7 @@ void Svy_ReqCreatOrEditSvy (void)
Surveys.Svy.NumQsts = 0; Surveys.Svy.NumQsts = 0;
Surveys.Svy.NumUsrs = 0; Surveys.Svy.NumUsrs = 0;
Surveys.Svy.Status.HiddenOrVisible = HidVis_VISIBLE; Surveys.Svy.Status.HiddenOrVisible = HidVis_VISIBLE;
Surveys.Svy.Status.Open = CloOpe_OPEN; Surveys.Svy.Status.ClosedOrOpen = CloOpe_OPEN;
Surveys.Svy.Status.IAmLoggedWithAValidRoleToAnswer = false; Surveys.Svy.Status.IAmLoggedWithAValidRoleToAnswer = false;
Surveys.Svy.Status.IBelongToScope = false; Surveys.Svy.Status.IBelongToScope = false;
Surveys.Svy.Status.IHaveAnswered = false; Surveys.Svy.Status.IHaveAnswered = false;

View File

@ -54,7 +54,7 @@ struct Svy_Survey
struct struct
{ {
HidVis_HiddenOrVisible_t HiddenOrVisible; // Survey is hidden or visible? HidVis_HiddenOrVisible_t HiddenOrVisible; // Survey is hidden or visible?
CloOpe_ClosedOrOpen_t Open; // Start date <= now <= end date CloOpe_ClosedOrOpen_t ClosedOrOpen; // Start date <= now <= end date
bool IAmLoggedWithAValidRoleToAnswer; // I am logged with a valid role to answer this survey bool IAmLoggedWithAValidRoleToAnswer; // I am logged with a valid role to answer this survey
bool IBelongToScope; // I belong to the scope of this survey bool IBelongToScope; // I belong to the scope of this survey
bool IHaveAnswered; // I have already answered this survey bool IHaveAnswered; // I have already answered this survey