mirror of https://github.com/acanas/swad-core.git
Version 22.119: Jun 06, 2023 Code refactoring related to hidden-visible.
This commit is contained in:
parent
31642fe486
commit
6bf4b5f2aa
14
swad_API.c
14
swad_API.c
|
@ -2309,8 +2309,8 @@ int swad__getAttendanceEvents (struct soap *soap,
|
|||
Att_GetEventDataFromRow (row,&Event);
|
||||
|
||||
getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].attendanceEventCode = (int) Event.AttCod;
|
||||
getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].hidden = Event.Hidden ? 1 :
|
||||
0;
|
||||
getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].hidden = (Event.HiddenOrVisible == Cns_HIDDEN) ? 1 :
|
||||
0;
|
||||
Gbl.Usrs.Other.UsrDat.UsrCod = Event.UsrCod;
|
||||
if (API_GetSomeUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,Gbl.Hierarchy.Crs.CrsCod)) // Get some user's data from database
|
||||
{
|
||||
|
@ -2485,8 +2485,8 @@ int swad__sendAttendanceEvent (struct soap *soap,
|
|||
}
|
||||
|
||||
/* Is event hidden? */
|
||||
Event.Hidden = (hidden ? true :
|
||||
false);
|
||||
Event.HiddenOrVisible = (hidden ? Cns_HIDDEN :
|
||||
Cns_VISIBLE);
|
||||
|
||||
/* User's code (really not used) */
|
||||
Event.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod;
|
||||
|
@ -4703,8 +4703,8 @@ int swad__getDirectoryTree (struct soap *soap,
|
|||
|
||||
/* Get directory tree into XML file */
|
||||
XML_WriteStartFile (XML,"tree",false);
|
||||
if (!Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Brw_IS_FOLDER,
|
||||
Gbl.FileBrowser.FilFolLnk.Full)) // If root folder is visible
|
||||
if (Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Brw_IS_FOLDER,
|
||||
Gbl.FileBrowser.FilFolLnk.Full) == Cns_VISIBLE)
|
||||
API_ListDir (XML,1,
|
||||
Gbl.FileBrowser.Priv.PathRootFolder,
|
||||
Brw_RootFolderInternalNames[Gbl.FileBrowser.Type]);
|
||||
|
@ -4818,7 +4818,7 @@ static bool API_WriteRowFileBrowser (FILE *XML,unsigned Level,
|
|||
if (Gbl.FileBrowser.Type == Brw_SHOW_DOC_CRS ||
|
||||
Gbl.FileBrowser.Type == Brw_SHOW_DOC_GRP)
|
||||
if (Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (FileType,
|
||||
Gbl.FileBrowser.FilFolLnk.Full))
|
||||
Gbl.FileBrowser.FilFolLnk.Full) == Cns_HIDDEN)
|
||||
return false;
|
||||
|
||||
/***** XML row *****/
|
||||
|
|
|
@ -233,7 +233,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
|
|||
[ActEdiBan ] = {1138,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Ban_EditBanners ,NULL},
|
||||
[ActNewBan ] = {1139,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,Ban_ReceiveFormNewBanner ,Ban_ContEditAfterChgBan ,NULL},
|
||||
[ActRemBan ] = {1140,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,Ban_RemoveBanner ,Ban_ContEditAfterChgBan ,NULL},
|
||||
[ActUnhBan ] = {1212,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,Ban_ShowBanner ,Ban_ContEditAfterChgBan ,NULL},
|
||||
[ActUnhBan ] = {1212,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,Ban_UnhideBanner ,Ban_ContEditAfterChgBan ,NULL},
|
||||
[ActHidBan ] = {1213,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,Ban_HideBanner ,Ban_ContEditAfterChgBan ,NULL},
|
||||
[ActRenBanSho ] = {1141,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,Ban_RenameBannerShort ,Ban_ContEditAfterChgBan ,NULL},
|
||||
[ActRenBanFul ] = {1142,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,Ban_RenameBannerFull ,Ban_ContEditAfterChgBan ,NULL},
|
||||
|
|
|
@ -206,9 +206,9 @@ static void Agd_ShowMyAgenda (struct Agd_Agenda *Agenda)
|
|||
|
||||
static void Agd_ShowFormToSelPast__FutureEvents (const struct Agd_Agenda *Agenda)
|
||||
{
|
||||
extern const char *Txt_AGENDA_PAST___FUTURE_EVENTS[2];
|
||||
extern const char *Txt_AGENDA_PAST___FUTURE_EVENTS[Agd_NUM_PAST_FUTURE_EVENTS];
|
||||
Agd_Past__FutureEvents_t PstFut;
|
||||
static const char *Icon[2] =
|
||||
static const char *Icon[Agd_NUM_PAST_FUTURE_EVENTS] =
|
||||
{
|
||||
[Agd_PAST___EVENTS] = "calendar-minus.svg",
|
||||
[Agd_FUTURE_EVENTS] = "calendar-plus.svg",
|
||||
|
@ -247,7 +247,7 @@ static void Agd_ShowFormToSelPrivatPublicEvents (const struct Agd_Agenda *Agenda
|
|||
{
|
||||
const char *Icon;
|
||||
Ico_Color_t Color;
|
||||
} Icon[2] =
|
||||
} Icon[Agd_NUM_PRIVAT_PUBLIC_EVENTS] =
|
||||
{
|
||||
[Agd_PRIVAT_EVENTS] = {"lock.svg" ,Ico_RED },
|
||||
[Agd_PUBLIC_EVENTS] = {"unlock.svg",Ico_GREEN},
|
||||
|
@ -280,33 +280,33 @@ static void Agd_ShowFormToSelPrivatPublicEvents (const struct Agd_Agenda *Agenda
|
|||
|
||||
static void Agd_ShowFormToSelHiddenVisiblEvents (const struct Agd_Agenda *Agenda)
|
||||
{
|
||||
extern const char *Txt_AGENDA_HIDDEN_VISIBL_EVENTS[2];
|
||||
Agd_HiddenVisiblEvents_t HidVis;
|
||||
extern const char *Txt_AGENDA_HIDDEN_VISIBLE_EVENTS[Cns_NUM_HIDDEN_VISIBLE];
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible;
|
||||
static const struct
|
||||
{
|
||||
const char *Icon;
|
||||
Ico_Color_t Color;
|
||||
} Icon[2] =
|
||||
} Icon[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Agd_HIDDEN_EVENTS] = {"eye-slash.svg",Ico_RED },
|
||||
[Agd_VISIBL_EVENTS] = {"eye.svg" ,Ico_GREEN},
|
||||
[Cns_HIDDEN ] = {"eye-slash.svg",Ico_RED },
|
||||
[Cns_VISIBLE] = {"eye.svg" ,Ico_GREEN},
|
||||
};
|
||||
|
||||
Set_BeginOneSettingSelector ();
|
||||
for (HidVis = Agd_HIDDEN_EVENTS;
|
||||
HidVis <= Agd_VISIBL_EVENTS;
|
||||
HidVis++)
|
||||
for (HiddenOrVisible = Cns_HIDDEN;
|
||||
HiddenOrVisible <= Cns_VISIBLE;
|
||||
HiddenOrVisible++)
|
||||
{
|
||||
Set_BeginPref ((Agenda->HiddenVisiblEvents & (1 << HidVis)));
|
||||
Set_BeginPref ((Agenda->HiddenVisiblEvents & (1 << HiddenOrVisible)));
|
||||
Frm_BeginForm (ActSeeMyAgd);
|
||||
Agd_PutParsMyAgenda (Agenda->Past__FutureEvents,
|
||||
Agenda->PrivatPublicEvents,
|
||||
Agenda->HiddenVisiblEvents ^ (1 << HidVis), // Toggle
|
||||
Agenda->HiddenVisiblEvents ^ (1 << HiddenOrVisible), // Toggle
|
||||
Agenda->SelectedOrder,
|
||||
Agenda->CurrentPage,
|
||||
-1L);
|
||||
Ico_PutSettingIconLink (Icon[HidVis].Icon,Icon[HidVis].Color,
|
||||
Txt_AGENDA_HIDDEN_VISIBL_EVENTS[HidVis]);
|
||||
Ico_PutSettingIconLink (Icon[HiddenOrVisible].Icon,Icon[HiddenOrVisible].Color,
|
||||
Txt_AGENDA_HIDDEN_VISIBLE_EVENTS[HiddenOrVisible]);
|
||||
Frm_EndForm ();
|
||||
Set_EndPref ();
|
||||
}
|
||||
|
@ -360,8 +360,8 @@ static unsigned Agd_GetParsHiddenVisiblEvents (void)
|
|||
{
|
||||
return (unsigned) Par_GetParUnsignedLong (ParHiddenVisiblName,
|
||||
0,
|
||||
(1 << Agd_HIDDEN_EVENTS) |
|
||||
(1 << Agd_VISIBL_EVENTS),
|
||||
(1 << Cns_HIDDEN) |
|
||||
(1 << Cns_VISIBLE),
|
||||
Agd_DEFAULT_HIDDEN_EVENTS |
|
||||
Agd_DEFAULT_VISIBL_EVENTS);
|
||||
}
|
||||
|
@ -748,8 +748,17 @@ static void Agd_PutIconsOtherPublicAgenda (void *EncryptedUsrCod)
|
|||
static void Agd_ShowOneEvent (struct Agd_Agenda *Agenda,
|
||||
Agd_AgendaType_t AgendaType,long AgdCod)
|
||||
{
|
||||
extern const char *Dat_TimeStatusClassVisible[Dat_NUM_TIME_STATUS];
|
||||
extern const char *Dat_TimeStatusClassHidden[Dat_NUM_TIME_STATUS];
|
||||
extern const char *Dat_TimeStatusClass[Dat_NUM_TIME_STATUS][Cns_NUM_HIDDEN_VISIBLE];
|
||||
static const char *TitleClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "ASG_TITLE_LIGHT",
|
||||
[Cns_VISIBLE] = "ASG_TITLE",
|
||||
};
|
||||
static const char *DataClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DAT_LIGHT",
|
||||
[Cns_VISIBLE] = "DAT",
|
||||
};
|
||||
char *Anchor = NULL;
|
||||
static unsigned UniqueId = 0;
|
||||
char *Id;
|
||||
|
@ -788,8 +797,7 @@ static void Agd_ShowOneEvent (struct Agd_Agenda *Agenda,
|
|||
Err_NotEnoughMemoryExit ();
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LB %s_%s %s\"",
|
||||
Id,
|
||||
AgdEvent.Hidden ? Dat_TimeStatusClassHidden[AgdEvent.TimeStatus] :
|
||||
Dat_TimeStatusClassVisible[AgdEvent.TimeStatus],
|
||||
Dat_TimeStatusClass[AgdEvent.TimeStatus][AgdEvent.HiddenOrVisible],
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
Dat_WriteLocalDateHMSFromUTC (Id,AgdEvent.TimeUTC[StartEndTime],
|
||||
|
@ -803,8 +811,7 @@ static void Agd_ShowOneEvent (struct Agd_Agenda *Agenda,
|
|||
HTM_TD_Begin ("class=\"LT %s\"",The_GetColorRows ());
|
||||
HTM_ARTICLE_Begin (Anchor);
|
||||
HTM_SPAN_Begin ("class=\"%s_%s\"",
|
||||
AgdEvent.Hidden ? "ASG_TITLE_LIGHT" :
|
||||
"ASG_TITLE",
|
||||
TitleClass[AgdEvent.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (AgdEvent.Title);
|
||||
HTM_SPAN_End ();
|
||||
|
@ -814,8 +821,7 @@ static void Agd_ShowOneEvent (struct Agd_Agenda *Agenda,
|
|||
/* Location */
|
||||
HTM_TD_Begin ("class=\"LT %s\"",The_GetColorRows ());
|
||||
HTM_SPAN_Begin ("class=\"%s_%s\"",
|
||||
AgdEvent.Hidden ? "ASG_TITLE_LIGHT" :
|
||||
"ASG_TITLE",
|
||||
TitleClass[AgdEvent.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (AgdEvent.Location);
|
||||
HTM_SPAN_End ();
|
||||
|
@ -842,8 +848,7 @@ static void Agd_ShowOneEvent (struct Agd_Agenda *Agenda,
|
|||
/* Text of the event */
|
||||
HTM_TD_Begin ("colspan=\"2\" class=\"LT %s\"",The_GetColorRows ());
|
||||
HTM_DIV_Begin ("class=\"PAR %s_%s\"",
|
||||
AgdEvent.Hidden ? "DAT_LIGHT" :
|
||||
"DAT",
|
||||
DataClass[AgdEvent.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
Agd_DB_GetEventTxt (&AgdEvent,Txt);
|
||||
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
|
||||
|
@ -867,10 +872,10 @@ static void Agd_PutFormsToRemEditOneEvent (struct Agd_Agenda *Agenda,
|
|||
struct Agd_Event *AgdEvent,
|
||||
const char *Anchor)
|
||||
{
|
||||
static Act_Action_t ActionHideUnhide[2] =
|
||||
static Act_Action_t ActionHideUnhide[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = ActHidEvtMyAgd, // Visible ==> action to hide
|
||||
[true ] = ActUnhEvtMyAgd, // Hidden ==> action to unhide
|
||||
[Cns_HIDDEN ] = ActUnhEvtMyAgd, // Hidden ==> action to unhide
|
||||
[Cns_VISIBLE] = ActHidEvtMyAgd, // Visible ==> action to hide
|
||||
};
|
||||
|
||||
Agenda->AgdCodToEdit = AgdEvent->AgdCod; // Used as parameter in contextual links
|
||||
|
@ -882,7 +887,7 @@ static void Agd_PutFormsToRemEditOneEvent (struct Agd_Agenda *Agenda,
|
|||
/***** Icon to hide/unhide event *****/
|
||||
Ico_PutContextualIconToHideUnhide (ActionHideUnhide,Anchor,
|
||||
Agd_PutCurrentParsMyAgenda,Agenda,
|
||||
AgdEvent->Hidden);
|
||||
AgdEvent->HiddenOrVisible);
|
||||
|
||||
/***** Icon to edit event *****/
|
||||
Ico_PutContextualIconToEdit (ActEdiOneEvtMyAgd,NULL,
|
||||
|
@ -1087,7 +1092,8 @@ static void Agd_GetventDataByCod (struct Agd_Event *AgdEvent)
|
|||
/* Get whether the event is public or not (row[1])
|
||||
and whether it is hidden or not (row[2]) */
|
||||
AgdEvent->Public = (row[1][0] == 'Y');
|
||||
AgdEvent->Hidden = (row[2][0] == 'Y');
|
||||
AgdEvent->HiddenOrVisible = (row[2][0] == 'Y') ? Cns_HIDDEN :
|
||||
Cns_VISIBLE;
|
||||
|
||||
/* Get start date (row[3]) and end date (row[4]) in UTC time */
|
||||
AgdEvent->TimeUTC[Dat_STR_TIME] = Dat_GetUNIXTimeFromStr (row[3]);
|
||||
|
@ -1107,7 +1113,7 @@ static void Agd_GetventDataByCod (struct Agd_Event *AgdEvent)
|
|||
/***** Clear all event data *****/
|
||||
AgdEvent->AgdCod = -1L;
|
||||
AgdEvent->Public = false;
|
||||
AgdEvent->Hidden = false;
|
||||
AgdEvent->HiddenOrVisible = Cns_VISIBLE;
|
||||
AgdEvent->TimeUTC[Dat_STR_TIME] =
|
||||
AgdEvent->TimeUTC[Dat_END_TIME] = (time_t) 0;
|
||||
AgdEvent->TimeStatus = Dat_FUTURE;
|
||||
|
|
|
@ -45,13 +45,14 @@ struct Agd_Event
|
|||
long AgdCod;
|
||||
long UsrCod;
|
||||
bool Public;
|
||||
bool Hidden;
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible;
|
||||
time_t TimeUTC[Dat_NUM_START_END_TIME];
|
||||
Dat_TimeStatus_t TimeStatus;
|
||||
char Title[Agd_MAX_BYTES_EVENT + 1];
|
||||
char Location[Agd_MAX_BYTES_LOCATION + 1];
|
||||
};
|
||||
|
||||
#define Agd_NUM_PAST_FUTURE_EVENTS 2
|
||||
typedef enum
|
||||
{
|
||||
Agd_PAST___EVENTS = 0, // Events until yesterday (included)
|
||||
|
@ -60,6 +61,7 @@ typedef enum
|
|||
#define Agd_DEFAULT_PAST___EVENTS (0 << Agd_PAST___EVENTS) // off
|
||||
#define Agd_DEFAULT_FUTURE_EVENTS (1 << Agd_FUTURE_EVENTS) // on
|
||||
|
||||
#define Agd_NUM_PRIVAT_PUBLIC_EVENTS 2
|
||||
typedef enum
|
||||
{
|
||||
Agd_PRIVAT_EVENTS = 0,
|
||||
|
@ -68,13 +70,8 @@ typedef enum
|
|||
#define Agd_DEFAULT_PRIVAT_EVENTS (1 << Agd_PRIVAT_EVENTS) // on
|
||||
#define Agd_DEFAULT_PUBLIC_EVENTS (1 << Agd_PUBLIC_EVENTS) // on
|
||||
|
||||
typedef enum
|
||||
{
|
||||
Agd_HIDDEN_EVENTS = 0,
|
||||
Agd_VISIBL_EVENTS = 1,
|
||||
} Agd_HiddenVisiblEvents_t;
|
||||
#define Agd_DEFAULT_HIDDEN_EVENTS (0 << Agd_HIDDEN_EVENTS) // off
|
||||
#define Agd_DEFAULT_VISIBL_EVENTS (1 << Agd_VISIBL_EVENTS) // on
|
||||
#define Agd_DEFAULT_HIDDEN_EVENTS (0 << Cns_HIDDEN) // off
|
||||
#define Agd_DEFAULT_VISIBL_EVENTS (1 << Cns_VISIBLE) // on
|
||||
|
||||
#define Agd_ORDER_DEFAULT Dat_STR_TIME
|
||||
|
||||
|
|
|
@ -116,11 +116,11 @@ unsigned Agd_DB_GetListEvents (MYSQL_RES **mysql_res,
|
|||
}
|
||||
switch (Agenda->HiddenVisiblEvents)
|
||||
{
|
||||
case (1 << Agd_HIDDEN_EVENTS):
|
||||
case (1 << Cns_HIDDEN):
|
||||
Str_Copy (HiddenVisiblEventsSubQuery," AND Hidden='Y'",
|
||||
sizeof (HiddenVisiblEventsSubQuery) - 1); // Hidden events
|
||||
break;
|
||||
case (1 << Agd_VISIBL_EVENTS):
|
||||
case (1 << Cns_VISIBLE):
|
||||
Str_Copy (HiddenVisiblEventsSubQuery," AND Hidden='N'",
|
||||
sizeof (HiddenVisiblEventsSubQuery) - 1); // Visible events
|
||||
break;
|
||||
|
|
|
@ -216,10 +216,10 @@ static void Ann_DrawAnAnnouncement (struct Ann_Announcement *Announcement,
|
|||
[Ann_ACTIVE_ANNOUNCEMENT ] = "NOTICE_BOX NOTICE_BOX_WIDE",
|
||||
[Ann_OBSOLETE_ANNOUNCEMENT] = "NOTICE_BOX NOTICE_BOX_WIDE LIGHT",
|
||||
};
|
||||
static Act_Action_t ActionHideUnhide[2] =
|
||||
static Act_Action_t ActionHideUnhide[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = ActHidAnn, // Visible ==> action to hide
|
||||
[true ] = ActUnhAnn, // Hidden ==> action to unhide
|
||||
[Cns_HIDDEN ] = ActUnhAnn, // Hidden ==> action to unhide
|
||||
[Cns_VISIBLE] = ActHidAnn, // Visible ==> action to hide
|
||||
};
|
||||
Rol_Role_t Role;
|
||||
bool SomeRolesAreSelected;
|
||||
|
@ -236,7 +236,8 @@ static void Ann_DrawAnAnnouncement (struct Ann_Announcement *Announcement,
|
|||
/***** Icon to hide/unhide the announcement *****/
|
||||
Ico_PutContextualIconToHideUnhide (ActionHideUnhide,NULL, // TODO: Put anchor
|
||||
Ann_PutParAnnCod,&Announcement->AnnCod,
|
||||
Announcement->Status == Ann_OBSOLETE_ANNOUNCEMENT);
|
||||
(Announcement->Status == Ann_OBSOLETE_ANNOUNCEMENT) ? Cns_HIDDEN :
|
||||
Cns_VISIBLE);
|
||||
}
|
||||
|
||||
/***** Write the subject of the announcement *****/
|
||||
|
|
|
@ -467,6 +467,16 @@ static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
|
|||
bool PrintView)
|
||||
{
|
||||
extern const char *Txt_Actions[ActLst_NUM_ACTIONS];
|
||||
static const char *TitleClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "ASG_TITLE_LIGHT",
|
||||
[Cns_VISIBLE] = "ASG_TITLE",
|
||||
};
|
||||
static const char *DataClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DAT_LIGHT",
|
||||
[Cns_VISIBLE] = "DAT",
|
||||
};
|
||||
char *Anchor = NULL;
|
||||
static unsigned UniqueId = 0;
|
||||
char *Id;
|
||||
|
@ -500,18 +510,18 @@ static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
|
|||
if (PrintView)
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LB %s_%s\"",
|
||||
Id,
|
||||
Assignments->Asg.Hidden ? (Assignments->Asg.Open ? "DATE_GREEN_LIGHT" :
|
||||
"DATE_RED_LIGHT") :
|
||||
(Assignments->Asg.Open ? "DATE_GREEN" :
|
||||
"DATE_RED"),
|
||||
Assignments->Asg.HiddenOrVisible == Cns_HIDDEN ? (Assignments->Asg.Open ? "DATE_GREEN_LIGHT" :
|
||||
"DATE_RED_LIGHT") :
|
||||
(Assignments->Asg.Open ? "DATE_GREEN" :
|
||||
"DATE_RED"),
|
||||
The_GetSuffix ());
|
||||
else
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LB %s_%s %s\"",
|
||||
Id,
|
||||
Assignments->Asg.Hidden ? (Assignments->Asg.Open ? "DATE_GREEN_LIGHT" :
|
||||
"DATE_RED_LIGHT") :
|
||||
(Assignments->Asg.Open ? "DATE_GREEN" :
|
||||
"DATE_RED"),
|
||||
Assignments->Asg.HiddenOrVisible == Cns_HIDDEN ? (Assignments->Asg.Open ? "DATE_GREEN_LIGHT" :
|
||||
"DATE_RED_LIGHT") :
|
||||
(Assignments->Asg.Open ? "DATE_GREEN" :
|
||||
"DATE_RED"),
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
Dat_WriteLocalDateHMSFromUTC (Id,Assignments->Asg.TimeUTC[StartEndTime],
|
||||
|
@ -532,8 +542,7 @@ static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
|
|||
Asg_PutPars (Assignments);
|
||||
HTM_BUTTON_Submit_Begin (Txt_Actions[ActSeeOneAsg],
|
||||
"class=\"LT BT_LINK %s_%s\"",
|
||||
Assignments->Asg.Hidden ? "ASG_TITLE_LIGHT" :
|
||||
"ASG_TITLE",
|
||||
TitleClass[Assignments->Asg.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Assignments->Asg.Title);
|
||||
HTM_BUTTON_End ();
|
||||
|
@ -581,8 +590,7 @@ static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
|
|||
Asg_GetAndWriteNamesOfGrpsAssociatedToAsg (&Assignments->Asg);
|
||||
|
||||
HTM_DIV_Begin ("class=\"PAR %s_%s\"",
|
||||
Assignments->Asg.Hidden ? "DAT_LIGHT" :
|
||||
"DAT",
|
||||
DataClass[Assignments->Asg.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt);
|
||||
HTM_DIV_End ();
|
||||
|
@ -604,7 +612,7 @@ static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
|
|||
|
||||
static void Asg_WriteAsgAuthor (struct Asg_Assignment *Asg)
|
||||
{
|
||||
Usr_WriteAuthor1Line (Asg->UsrCod,Asg->Hidden);
|
||||
Usr_WriteAuthor1Line (Asg->UsrCod,Asg->HiddenOrVisible);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -615,9 +623,9 @@ static void Asg_WriteAssignmentFolder (struct Asg_Assignment *Asg,bool PrintView
|
|||
{
|
||||
extern const char *Txt_Folder;
|
||||
Act_Action_t NextAction;
|
||||
bool ICanSendFiles = !Asg->Hidden && // It's visible (not hidden)
|
||||
Asg->Open && // It's open (inside dates)
|
||||
Asg->IBelongToCrsOrGrps; // I belong to course or groups
|
||||
bool ICanSendFiles = Asg->HiddenOrVisible == Cns_VISIBLE && // It's visible (not hidden)
|
||||
Asg->Open && // It's open (inside dates)
|
||||
Asg->IBelongToCrsOrGrps; // I belong to course or groups
|
||||
|
||||
/***** Folder icon *****/
|
||||
if (!PrintView && // Not print view
|
||||
|
@ -702,10 +710,10 @@ Dat_StartEndTime_t Asg_GetParAsgOrder (void)
|
|||
static void Asg_PutIconsToRemEditOneAsg (struct Asg_Assignments *Assignments,
|
||||
const char *Anchor)
|
||||
{
|
||||
static Act_Action_t ActionHideUnhide[2] =
|
||||
static Act_Action_t ActionHideUnhide[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = ActHidAsg, // Visible ==> action to hide
|
||||
[true ] = ActUnhAsg, // Hidden ==> action to unhide
|
||||
[Cns_HIDDEN ] = ActUnhAsg, // Hidden ==> action to unhide
|
||||
[Cns_VISIBLE] = ActHidAsg, // Visible ==> action to hide
|
||||
};
|
||||
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
|
@ -719,7 +727,7 @@ static void Asg_PutIconsToRemEditOneAsg (struct Asg_Assignments *Assignments,
|
|||
/***** Icon to hide/unhide assignment *****/
|
||||
Ico_PutContextualIconToHideUnhide (ActionHideUnhide,Anchor,
|
||||
Asg_PutPars,Assignments,
|
||||
Assignments->Asg.Hidden);
|
||||
Assignments->Asg.HiddenOrVisible);
|
||||
|
||||
/***** Icon to edit assignment *****/
|
||||
Ico_PutContextualIconToEdit (ActEdiOneAsg,NULL,
|
||||
|
@ -881,7 +889,8 @@ static void Asg_GetAssignmentDataFromRow (MYSQL_RES **mysql_res,
|
|||
Asg->AsgCod = Str_ConvertStrCodToLongCod (row[0]);
|
||||
|
||||
/* Get whether the assignment is hidden or not (row[1]) */
|
||||
Asg->Hidden = (row[1][0] == 'Y');
|
||||
Asg->HiddenOrVisible = (row[1][0] == 'Y') ? Cns_HIDDEN :
|
||||
Cns_VISIBLE;
|
||||
|
||||
/* Get author of the assignment (row[2]) */
|
||||
Asg->UsrCod = Str_ConvertStrCodToLongCod (row[2]);
|
||||
|
@ -915,7 +924,7 @@ static void Asg_ResetAssignment (struct Asg_Assignment *Asg)
|
|||
if (Asg->AsgCod <= 0) // If > 0 ==> keep value
|
||||
Asg->AsgCod = -1L;
|
||||
Asg->AsgCod = -1L;
|
||||
Asg->Hidden = false;
|
||||
Asg->HiddenOrVisible = Cns_VISIBLE;
|
||||
Asg->UsrCod = -1L;
|
||||
Asg->TimeUTC[Dat_STR_TIME] =
|
||||
Asg->TimeUTC[Dat_END_TIME] = (time_t) 0;
|
||||
|
@ -1555,6 +1564,11 @@ static void Asg_GetAndWriteNamesOfGrpsAssociatedToAsg (struct Asg_Assignment *As
|
|||
extern const char *Txt_Groups;
|
||||
extern const char *Txt_and;
|
||||
extern const char *Txt_The_whole_course;
|
||||
static const char *GroupClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "ASG_GRP_LIGHT",
|
||||
[Cns_VISIBLE] = "ASG_GRP",
|
||||
};
|
||||
MYSQL_RES *mysql_res;
|
||||
MYSQL_ROW row;
|
||||
unsigned NumGrps;
|
||||
|
@ -1565,8 +1579,7 @@ static void Asg_GetAndWriteNamesOfGrpsAssociatedToAsg (struct Asg_Assignment *As
|
|||
|
||||
/***** Write heading *****/
|
||||
HTM_DIV_Begin ("class=\"%s_%s\"",
|
||||
Asg->Hidden ? "ASG_GRP_LIGHT" :
|
||||
"ASG_GRP",
|
||||
GroupClass[Asg->HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
|
||||
HTM_TxtColonNBSP (NumGrps == 1 ? Txt_Group :
|
||||
|
|
|
@ -49,7 +49,7 @@ typedef enum
|
|||
struct Asg_Assignment
|
||||
{
|
||||
long AsgCod;
|
||||
bool Hidden;
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible;
|
||||
long UsrCod;
|
||||
time_t TimeUTC[Dat_NUM_START_END_TIME];
|
||||
bool Open;
|
||||
|
|
|
@ -427,6 +427,16 @@ static void Att_ShowOneEventRow (struct Att_Events *Events,
|
|||
bool ShowOnlyThisAttEventComplete)
|
||||
{
|
||||
extern const char *Txt_View_event;
|
||||
static const char *TitleClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "ASG_TITLE_LIGHT",
|
||||
[Cns_VISIBLE] = "ASG_TITLE",
|
||||
};
|
||||
static const char *DataClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DAT_LIGHT",
|
||||
[Cns_VISIBLE] = "DAT",
|
||||
};
|
||||
char *Anchor = NULL;
|
||||
static unsigned UniqueId = 0;
|
||||
char *Id;
|
||||
|
@ -459,18 +469,18 @@ static void Att_ShowOneEventRow (struct Att_Events *Events,
|
|||
if (ShowOnlyThisAttEventComplete)
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LB %s_%s\"",
|
||||
Id,
|
||||
Events->Event.Hidden ? (Events->Event.Open ? "DATE_GREEN_LIGHT" :
|
||||
"DATE_RED_LIGHT") :
|
||||
(Events->Event.Open ? "DATE_GREEN" :
|
||||
"DATE_RED"),
|
||||
Events->Event.HiddenOrVisible == Cns_HIDDEN ? (Events->Event.Open ? "DATE_GREEN_LIGHT" :
|
||||
"DATE_RED_LIGHT") :
|
||||
(Events->Event.Open ? "DATE_GREEN" :
|
||||
"DATE_RED"),
|
||||
The_GetSuffix ());
|
||||
else
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LB %s_%s %s\"",
|
||||
Id,
|
||||
Events->Event.Hidden ? (Events->Event.Open ? "DATE_GREEN_LIGHT" :
|
||||
"DATE_RED_LIGHT") :
|
||||
(Events->Event.Open ? "DATE_GREEN" :
|
||||
"DATE_RED"),
|
||||
Events->Event.HiddenOrVisible == Cns_HIDDEN ? (Events->Event.Open ? "DATE_GREEN_LIGHT" :
|
||||
"DATE_RED_LIGHT") :
|
||||
(Events->Event.Open ? "DATE_GREEN" :
|
||||
"DATE_RED"),
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
Dat_WriteLocalDateHMSFromUTC (Id,Events->Event.TimeUTC[StartEndTime],
|
||||
|
@ -496,8 +506,7 @@ static void Att_ShowOneEventRow (struct Att_Events *Events,
|
|||
else
|
||||
HTM_TD_Begin ("class=\"RT %s\"",The_GetColorRows ());
|
||||
HTM_SPAN_Begin ("class=\"%s_%s\"",
|
||||
Events->Event.Hidden ? "ASG_TITLE_LIGHT" :
|
||||
"ASG_TITLE",
|
||||
TitleClass[Events->Event.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Unsigned (Events->Event.NumStdsTotal);
|
||||
HTM_SPAN_End ();
|
||||
|
@ -529,8 +538,7 @@ static void Att_ShowOneEventRow (struct Att_Events *Events,
|
|||
Att_GetAndWriteNamesOfGrpsAssociatedToEvent (&Events->Event);
|
||||
|
||||
HTM_DIV_Begin ("class=\"%s_%s\"",
|
||||
Events->Event.Hidden ? "DAT_LIGHT" :
|
||||
"DAT",
|
||||
DataClass[Events->Event.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Description);
|
||||
HTM_DIV_End ();
|
||||
|
@ -549,7 +557,7 @@ static void Att_ShowOneEventRow (struct Att_Events *Events,
|
|||
|
||||
static void Att_WriteEventAuthor (struct Att_Event *Event)
|
||||
{
|
||||
Usr_WriteAuthor1Line (Event->UsrCod,Event->Hidden);
|
||||
Usr_WriteAuthor1Line (Event->UsrCod,Event->HiddenOrVisible);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -572,10 +580,10 @@ static Dat_StartEndTime_t Att_GetParAttOrder (void)
|
|||
static void Att_PutFormsToRemEditOneEvent (struct Att_Events *Events,
|
||||
const char *Anchor)
|
||||
{
|
||||
static Act_Action_t ActionHideUnhide[2] =
|
||||
static Act_Action_t ActionHideUnhide[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = ActHidAtt, // Visible ==> action to hide
|
||||
[true ] = ActUnhAtt, // Hidden ==> action to unhide
|
||||
[Cns_HIDDEN ] = ActUnhAtt, // Hidden ==> action to unhide
|
||||
[Cns_VISIBLE] = ActHidAtt, // Visible ==> action to hide
|
||||
};
|
||||
|
||||
if (Att_CheckIfICanEditEvents ())
|
||||
|
@ -587,7 +595,7 @@ static void Att_PutFormsToRemEditOneEvent (struct Att_Events *Events,
|
|||
/***** Icon to hide/unhide attendance event *****/
|
||||
Ico_PutContextualIconToHideUnhide (ActionHideUnhide,Anchor,
|
||||
Att_PutPars,Events,
|
||||
Events->Event.Hidden);
|
||||
Events->Event.HiddenOrVisible);
|
||||
|
||||
/***** Icon to edit attendance event *****/
|
||||
Ico_PutContextualIconToEdit (ActEdiOneAtt,NULL,
|
||||
|
@ -743,7 +751,7 @@ static void Att_ResetEvent (struct Att_Event *Event)
|
|||
Event->NumStdsTotal = 0;
|
||||
}
|
||||
Event->CrsCod = -1L;
|
||||
Event->Hidden = false;
|
||||
Event->HiddenOrVisible = Cns_VISIBLE;
|
||||
Event->UsrCod = -1L;
|
||||
Event->TimeUTC[Dat_STR_TIME] =
|
||||
Event->TimeUTC[Dat_END_TIME] = (time_t) 0;
|
||||
|
@ -763,7 +771,8 @@ void Att_GetEventDataFromRow (MYSQL_ROW row,struct Att_Event *Event)
|
|||
Event->CrsCod = Str_ConvertStrCodToLongCod (row[1]);
|
||||
|
||||
/***** Get whether the attendance event is hidden or not (row[2]) *****/
|
||||
Event->Hidden = (row[2][0] == 'Y');
|
||||
Event->HiddenOrVisible = (row[2][0] == 'Y') ? Cns_HIDDEN :
|
||||
Cns_VISIBLE;
|
||||
|
||||
/***** Get author of the attendance event (row[3]) *****/
|
||||
Event->UsrCod = Str_ConvertStrCodToLongCod (row[3]);
|
||||
|
@ -1167,7 +1176,7 @@ void Att_ReceiveFormEvent (void)
|
|||
/* Get data of the old (current) attendance event from database */
|
||||
OldAtt.AttCod = ReceivedAtt.AttCod;
|
||||
Att_GetEventDataByCodAndCheckCrs (&OldAtt);
|
||||
ReceivedAtt.Hidden = OldAtt.Hidden;
|
||||
ReceivedAtt.HiddenOrVisible = OldAtt.HiddenOrVisible;
|
||||
}
|
||||
|
||||
/***** Get start/end date-times *****/
|
||||
|
@ -1215,7 +1224,7 @@ void Att_ReceiveFormEvent (void)
|
|||
|
||||
if (ItsANewAttEvent)
|
||||
{
|
||||
ReceivedAtt.Hidden = false; // New attendance events are visible by default
|
||||
ReceivedAtt.HiddenOrVisible = Cns_VISIBLE; // New attendance events are visible by default
|
||||
Att_CreateEvent (&ReceivedAtt,Description); // Add new attendance event to database
|
||||
|
||||
/***** Write success message *****/
|
||||
|
@ -1297,6 +1306,11 @@ static void Att_GetAndWriteNamesOfGrpsAssociatedToEvent (struct Att_Event *Event
|
|||
extern const char *Txt_Groups;
|
||||
extern const char *Txt_and;
|
||||
extern const char *Txt_The_whole_course;
|
||||
static const char *GroupClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "ASG_GRP_LIGHT",
|
||||
[Cns_VISIBLE] = "ASG_GRP",
|
||||
};
|
||||
MYSQL_RES *mysql_res;
|
||||
MYSQL_ROW row;
|
||||
unsigned NumGrps;
|
||||
|
@ -1307,8 +1321,7 @@ static void Att_GetAndWriteNamesOfGrpsAssociatedToEvent (struct Att_Event *Event
|
|||
|
||||
/***** Begin container *****/
|
||||
HTM_DIV_Begin ("class=\"%s_%s\"",
|
||||
Event->Hidden ? "ASG_GRP_LIGHT" :
|
||||
"ASG_GRP",
|
||||
GroupClass[Event->HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
|
||||
/***** Write heading *****/
|
||||
|
@ -1832,6 +1845,12 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
|
|||
static void Att_PutLinkEvent (struct Att_Event *Event,
|
||||
const char *Title,const char *Txt)
|
||||
{
|
||||
static const char *TitleClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "ASG_TITLE_LIGHT",
|
||||
[Cns_VISIBLE] = "ASG_TITLE",
|
||||
};
|
||||
|
||||
/***** Begin form *****/
|
||||
Frm_BeginForm (ActSeeOneAtt);
|
||||
ParCod_PutPar (ParCod_Att,Event->AttCod);
|
||||
|
@ -1839,8 +1858,7 @@ static void Att_PutLinkEvent (struct Att_Event *Event,
|
|||
|
||||
/***** Link to view attendance event *****/
|
||||
HTM_BUTTON_Submit_Begin (Title,"class=\"LT BT_LINK %s_%s\"",
|
||||
Event->Hidden ? "ASG_TITLE_LIGHT" :
|
||||
"ASG_TITLE",
|
||||
TitleClass[Event->HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt);
|
||||
HTM_BUTTON_End ();
|
||||
|
|
|
@ -51,7 +51,7 @@ struct Att_Event
|
|||
/* Fields stored in database */
|
||||
long AttCod;
|
||||
long CrsCod;
|
||||
bool Hidden;
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible;
|
||||
long UsrCod;
|
||||
time_t TimeUTC[Dat_NUM_START_END_TIME];
|
||||
bool Open;
|
||||
|
|
|
@ -254,8 +254,8 @@ long Att_DB_CreateEvent (const struct Att_Event *Event,const char *Description)
|
|||
"FROM_UNIXTIME(%ld),FROM_UNIXTIME(%ld),"
|
||||
"'%c','%s','%s')",
|
||||
Gbl.Hierarchy.Crs.CrsCod,
|
||||
Event->Hidden ? 'Y' :
|
||||
'N',
|
||||
Event->HiddenOrVisible == Cns_HIDDEN ? 'Y' :
|
||||
'N',
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||
Event->TimeUTC[Dat_STR_TIME],
|
||||
Event->TimeUTC[Dat_END_TIME],
|
||||
|
@ -281,8 +281,8 @@ void Att_DB_UpdateEvent (const struct Att_Event *Event,const char *Description)
|
|||
"Txt='%s'"
|
||||
" WHERE AttCod=%ld"
|
||||
" AND CrsCod=%ld", // Extra check
|
||||
Event->Hidden ? 'Y' :
|
||||
'N',
|
||||
Event->HiddenOrVisible == Cns_HIDDEN ? 'Y' :
|
||||
'N',
|
||||
Event->TimeUTC[Dat_STR_TIME],
|
||||
Event->TimeUTC[Dat_END_TIME],
|
||||
Event->CommentTchVisible ? 'Y' :
|
||||
|
|
|
@ -93,7 +93,8 @@ static void Ban_PutIconsEditingBanners (__attribute__((unused)) void *Args);
|
|||
|
||||
static void Ban_ListBannersForEdition (struct Ban_Banners *Banners);
|
||||
static void Ban_PutParBanCod (void *BanCod);
|
||||
static void Ban_ShowOrHideBanner (struct Ban_Banner *Ban,bool Hide);
|
||||
static void Ban_ShowOrHideBanner (struct Ban_Banner *Ban,
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible);
|
||||
|
||||
static void Ban_RenameBanner (struct Ban_Banner *Ban,
|
||||
Cns_ShrtOrFullName_t ShrtOrFullName);
|
||||
|
@ -293,7 +294,7 @@ void Ban_GetBannerDataByCod (struct Ban_Banner *Ban)
|
|||
MYSQL_RES *mysql_res;
|
||||
|
||||
/***** Clear data *****/
|
||||
Ban->Hidden = false;
|
||||
Ban->HiddenOrVisible = Cns_VISIBLE;
|
||||
Ban->ShrtName[0] = Ban->FullName[0] = Ban->Img[0] = Ban->WWW[0] = '\0';
|
||||
|
||||
/***** Check if banner code is correct *****/
|
||||
|
@ -340,7 +341,8 @@ static void Ban_GetBannerDataFromRow (MYSQL_RES *mysql_res,
|
|||
Err_WrongBannerExit ();
|
||||
|
||||
/***** Get if the banner is hidden (row[1]) *****/
|
||||
Ban->Hidden = (row[1][0] == 'Y');
|
||||
Ban->HiddenOrVisible = (row[1][0] == 'Y') ? Cns_HIDDEN :
|
||||
Cns_VISIBLE;
|
||||
|
||||
/***** Get short name (row[2]), full name (row[3]),
|
||||
image (row[4]) and URL (row[5]) of the banner *****/
|
||||
|
@ -381,10 +383,15 @@ void Ban_PutIconToViewBanners (void)
|
|||
|
||||
static void Ban_ListBannersForEdition (struct Ban_Banners *Banners)
|
||||
{
|
||||
static Act_Action_t ActionHideUnhide[2] =
|
||||
static Act_Action_t ActionHideUnhide[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = ActHidBan, // Visible ==> action to hide
|
||||
[true ] = ActUnhBan, // Hidden ==> action to unhide
|
||||
[Cns_HIDDEN ] = ActUnhBan, // Hidden ==> action to unhide
|
||||
[Cns_VISIBLE] = ActHidBan, // Visible ==> action to hide
|
||||
};
|
||||
static const char *DataClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DAT_LIGHT",
|
||||
[Cns_VISIBLE] = "DAT",
|
||||
};
|
||||
unsigned NumBan;
|
||||
struct Ban_Banner *Ban;
|
||||
|
@ -422,13 +429,12 @@ static void Ban_ListBannersForEdition (struct Ban_Banners *Banners)
|
|||
Ico_PutContextualIconToHideUnhide (ActionHideUnhide,Anchor,
|
||||
Ban_PutParBanCod,
|
||||
&Banners->BanCodToEdit,
|
||||
Ban->Hidden);
|
||||
Ban->HiddenOrVisible);
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Banner code */
|
||||
HTM_TD_Begin ("class=\"RM %s_%s\"",
|
||||
Ban->Hidden ? "DAT_LIGHT" :
|
||||
"DAT",
|
||||
DataClass[Ban->HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_ARTICLE_Begin (Anchor);
|
||||
HTM_Long (Ban->BanCod);
|
||||
|
@ -527,10 +533,10 @@ void Ban_RemoveBanner (void)
|
|||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**************************** Show a hidden banner ***************************/
|
||||
/************************** Unhide a hidden banner ***************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Ban_ShowBanner (void)
|
||||
void Ban_UnhideBanner (void)
|
||||
{
|
||||
struct Ban_Banner *Ban = Ban_GetEditingBanner ();
|
||||
|
||||
|
@ -538,7 +544,7 @@ void Ban_ShowBanner (void)
|
|||
Ban_ResetBanner (Ban);
|
||||
|
||||
/***** Set banner as visible *****/
|
||||
Ban_ShowOrHideBanner (Ban,false);
|
||||
Ban_ShowOrHideBanner (Ban,Cns_VISIBLE);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -553,14 +559,15 @@ void Ban_HideBanner (void)
|
|||
Ban_ResetBanner (Ban);
|
||||
|
||||
/***** Set banner as hidden *****/
|
||||
Ban_ShowOrHideBanner (Ban,true);
|
||||
Ban_ShowOrHideBanner (Ban,Cns_HIDDEN);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/*************** Change hiddeness of banner in the database ******************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static void Ban_ShowOrHideBanner (struct Ban_Banner *Ban,bool Hide)
|
||||
static void Ban_ShowOrHideBanner (struct Ban_Banner *Ban,
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible)
|
||||
{
|
||||
/***** Get banner code *****/
|
||||
Ban->BanCod = ParCod_GetAndCheckPar (ParCod_Ban);
|
||||
|
@ -569,8 +576,8 @@ static void Ban_ShowOrHideBanner (struct Ban_Banner *Ban,bool Hide)
|
|||
Ban_GetBannerDataByCod (Ban);
|
||||
|
||||
/***** Mark file as hidden/visible in database *****/
|
||||
if (Ban->Hidden != Hide)
|
||||
Ban_DB_HideOrUnhideBanner (Ban->BanCod,Hide);
|
||||
if (Ban->HiddenOrVisible != HiddenOrVisible)
|
||||
Ban_DB_HideOrUnhideBanner (Ban->BanCod,HiddenOrVisible);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -1033,7 +1040,7 @@ static void Ban_ResetBanner (struct Ban_Banner *Ban)
|
|||
{
|
||||
/***** Reset banner *****/
|
||||
Ban->BanCod = -1L;
|
||||
Ban->Hidden = true;
|
||||
Ban->HiddenOrVisible = Cns_HIDDEN;
|
||||
Ban->ShrtName[0] = '\0';
|
||||
Ban->FullName[0] = '\0';
|
||||
Ban->Img[0] = '\0';
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
struct Ban_Banner
|
||||
{
|
||||
long BanCod;
|
||||
bool Hidden;
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible;
|
||||
char ShrtName[Ban_MAX_BYTES_SHRT_NAME + 1];
|
||||
char FullName[Ban_MAX_BYTES_FULL_NAME + 1];
|
||||
char Img[Ban_MAX_BYTES_IMAGE + 1];
|
||||
|
@ -63,7 +63,7 @@ void Ban_PutIconToViewBanners (void);
|
|||
|
||||
void Ban_GetBannerDataByCod (struct Ban_Banner *Ban);
|
||||
void Ban_RemoveBanner (void);
|
||||
void Ban_ShowBanner (void);
|
||||
void Ban_UnhideBanner (void);
|
||||
void Ban_HideBanner (void);
|
||||
void Ban_RenameBannerShort (void);
|
||||
void Ban_RenameBannerFull (void);
|
||||
|
|
|
@ -156,14 +156,14 @@ void Ban_DB_CreateBanner (const struct Ban_Banner *Ban)
|
|||
/**************************** Hide/unhide a banner ***************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Ban_DB_HideOrUnhideBanner (long BanCod,bool Hide)
|
||||
void Ban_DB_HideOrUnhideBanner (long BanCod,Cns_HiddenOrVisible_t HiddenOrVisible)
|
||||
{
|
||||
DB_QueryUPDATE ("can not hide/unhide banner",
|
||||
"UPDATE ban_banners"
|
||||
" SET Hidden='%c'"
|
||||
" WHERE BanCod=%ld",
|
||||
Hide ? 'Y' :
|
||||
'N',
|
||||
HiddenOrVisible == Cns_HIDDEN ? 'Y' :
|
||||
'N',
|
||||
BanCod);
|
||||
}
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ unsigned Ban_DB_GetBannerDataByCod (MYSQL_RES **mysql_res,long BanCod);
|
|||
bool Ban_DB_CheckIfBannerNameExists (const char *FldName,const char *Name,long BanCod);
|
||||
|
||||
void Ban_DB_CreateBanner (const struct Ban_Banner *Ban);
|
||||
void Ban_DB_HideOrUnhideBanner (long BanCod,bool Hide);
|
||||
void Ban_DB_HideOrUnhideBanner (long BanCod,Cns_HiddenOrVisible_t HiddenOrVisible);
|
||||
void Ban_DB_UpdateBanName (long BanCod,const char *FldName,
|
||||
const char *NewBanName);
|
||||
void Ban_DB_UpdateBanImg (long BanCod,
|
||||
|
|
209
swad_browser.c
209
swad_browser.c
|
@ -354,39 +354,6 @@ static const Act_Action_t Brw_ActChgZone[Brw_NUM_TYPES_FILE_BROWSER] =
|
|||
[Brw_ADMI_ASS_PRJ] = ActUnk,
|
||||
};
|
||||
|
||||
static const Act_Action_t Brw_ActHideUnhide[Brw_NUM_TYPES_FILE_BROWSER][2] =
|
||||
{
|
||||
[Brw_UNKNOWN ] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_SHOW_DOC_CRS] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_SHOW_MRK_CRS] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_DOC_CRS] = {[false] = ActHidDocCrs ,[true] = ActUnhDocCrs },
|
||||
[Brw_ADMI_SHR_CRS] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_SHR_GRP] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_WRK_USR] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_WRK_CRS] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_MRK_CRS] = {[false] = ActHidMrkCrs ,[true] = ActUnhMrkCrs },
|
||||
[Brw_ADMI_BRF_USR] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_SHOW_DOC_GRP] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_DOC_GRP] = {[false] = ActHidDocGrp ,[true] = ActUnhDocGrp },
|
||||
[Brw_SHOW_MRK_GRP] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_MRK_GRP] = {[false] = ActHidMrkGrp ,[true] = ActUnhMrkGrp },
|
||||
[Brw_ADMI_ASG_USR] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_ASG_CRS] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_SHOW_DOC_DEG] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_DOC_DEG] = {[false] = ActHidDocDeg ,[true] = ActUnhDocDeg },
|
||||
[Brw_SHOW_DOC_CTR] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_DOC_CTR] = {[false] = ActHidDocCtr ,[true] = ActUnhDocCtr },
|
||||
[Brw_SHOW_DOC_INS] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_DOC_INS] = {[false] = ActHidDocIns ,[true] = ActUnhDocIns },
|
||||
[Brw_ADMI_SHR_DEG] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_SHR_CTR] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_SHR_INS] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_TCH_CRS] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_TCH_GRP] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_DOC_PRJ] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
[Brw_ADMI_ASS_PRJ] = {[false] = ActUnk ,[true] = ActUnk },
|
||||
};
|
||||
|
||||
static const Act_Action_t Brw_ActReqDatFile[Brw_NUM_TYPES_FILE_BROWSER] =
|
||||
{
|
||||
[Brw_UNKNOWN ] = ActUnk,
|
||||
|
@ -1110,20 +1077,21 @@ static void Brw_IndentAndWriteIconExpandContract (unsigned Level,
|
|||
Brw_IconTree_t IconThisRow);
|
||||
static void Brw_IndentDependingOnLevel (unsigned Level);
|
||||
static void Brw_PutIconToExpandFolder (const char *FileBrowserId,const char *RowId,
|
||||
bool Hidden);
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible);
|
||||
static void Brw_PutIconToContractFolder (const char *FileBrowserId,const char *RowId,
|
||||
bool Hidden);
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible);
|
||||
|
||||
static void Brw_PutIconHideUnhide (const char *Anchor,bool RowSetAsHidden);
|
||||
static void Brw_PutIconHideUnhide (const char *Anchor,
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible);
|
||||
static bool Brw_CheckIfAnyHigherLevelIsHidden (unsigned CurrentLevel);
|
||||
|
||||
static void Brw_PutIconFolder (unsigned Level,
|
||||
const char *FileBrowserId,const char *RowId,
|
||||
Brw_IconTree_t IconSubtree);
|
||||
static void Brw_PutIconFolderWithoutPlus (const char *FileBrowserId,const char *RowId,
|
||||
bool Open,bool Hidden);
|
||||
bool Open,Cns_HiddenOrVisible_t HiddenOrVisible);
|
||||
static void Brw_PutIconFolderWithPlus (const char *FileBrowserId,const char *RowId,
|
||||
bool Open,bool Hidden);
|
||||
bool Open,Cns_HiddenOrVisible_t HiddenOrVisible);
|
||||
|
||||
static void Brw_PutIconNewFileOrFolder (void);
|
||||
static void Brw_PutIconFileWithLinkToViewMetadata (const struct Brw_FileMetadata *FileMetadata);
|
||||
|
@ -4038,7 +4006,7 @@ static bool Brw_WriteRowFileBrowser (unsigned Level,const char *RowId,
|
|||
Brw_IconTree_t IconThisRow)
|
||||
{
|
||||
char *Anchor;
|
||||
bool RowSetAsHidden = false;
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible = Cns_VISIBLE;
|
||||
bool RowSetAsPublic = false;
|
||||
bool LightStyle = false;
|
||||
bool IsRecent = false;
|
||||
|
@ -4075,18 +4043,23 @@ static bool Brw_WriteRowFileBrowser (unsigned Level,const char *RowId,
|
|||
if (SeeDocsZone || AdminDocsZone ||
|
||||
SeeMarks || AdminMarks)
|
||||
{
|
||||
RowSetAsHidden = Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Gbl.FileBrowser.FilFolLnk.Type,
|
||||
Gbl.FileBrowser.FilFolLnk.Full);
|
||||
if (RowSetAsHidden && Level && (SeeDocsZone || SeeMarks))
|
||||
HiddenOrVisible = Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Gbl.FileBrowser.FilFolLnk.Type,
|
||||
Gbl.FileBrowser.FilFolLnk.Full);
|
||||
if (HiddenOrVisible == Cns_HIDDEN && Level && (SeeDocsZone || SeeMarks))
|
||||
return false;
|
||||
if (AdminDocsZone || AdminMarks)
|
||||
{
|
||||
if (Gbl.FileBrowser.FilFolLnk.Type == Brw_IS_FOLDER)
|
||||
Gbl.FileBrowser.HiddenLevels[Level] = RowSetAsHidden;
|
||||
if (RowSetAsHidden) // this row is marked as hidden
|
||||
LightStyle = true;
|
||||
else // this row is not marked as hidden
|
||||
LightStyle = Brw_CheckIfAnyHigherLevelIsHidden (Level);
|
||||
Gbl.FileBrowser.HiddenLevels[Level] = (HiddenOrVisible == Cns_HIDDEN);
|
||||
switch (HiddenOrVisible)
|
||||
{
|
||||
case Cns_HIDDEN: // this row is marked as hidden
|
||||
LightStyle = true;
|
||||
break;
|
||||
case Cns_VISIBLE: // this row is not marked as hidden
|
||||
LightStyle = Brw_CheckIfAnyHigherLevelIsHidden (Level);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4216,7 +4189,7 @@ static bool Brw_WriteRowFileBrowser (unsigned Level,const char *RowId,
|
|||
|
||||
/* Put icon to hide/unhide file or folder */
|
||||
if (AdminDocsZone || AdminMarks)
|
||||
Brw_PutIconHideUnhide (Anchor,RowSetAsHidden);
|
||||
Brw_PutIconHideUnhide (Anchor,HiddenOrVisible);
|
||||
|
||||
/***** File or folder icon *****/
|
||||
switch (Gbl.FileBrowser.FilFolLnk.Type)
|
||||
|
@ -4266,7 +4239,7 @@ static bool Brw_WriteRowFileBrowser (unsigned Level,const char *RowId,
|
|||
HTM_TD_Begin ("class=\"BM %s\"",The_GetColorRows ());
|
||||
if (Gbl.Usrs.Me.Role.Logged >= Rol_STD && // Only ZIP folders if I am student, teacher...
|
||||
!SeeMarks && // Do not ZIP folders when seeing marks
|
||||
!(SeeDocsZone && RowSetAsHidden)) // When seeing docs, if folder is not hidden (this could happen for Level == 0)
|
||||
!(SeeDocsZone && HiddenOrVisible == Cns_HIDDEN)) // When seeing docs, if folder is not hidden (this could happen for Level == 0)
|
||||
Brw_PutButtonToDownloadZIPOfAFolder ();
|
||||
HTM_TD_End ();
|
||||
}
|
||||
|
@ -4280,7 +4253,7 @@ static bool Brw_WriteRowFileBrowser (unsigned Level,const char *RowId,
|
|||
|
||||
The_ChangeRowColor ();
|
||||
|
||||
if (RowSetAsHidden && (SeeDocsZone || SeeMarks))
|
||||
if (HiddenOrVisible == Cns_HIDDEN && (SeeDocsZone || SeeMarks))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
@ -4449,20 +4422,20 @@ static void Brw_IndentAndWriteIconExpandContract (unsigned Level,
|
|||
case Brw_ICON_TREE_EXPAND:
|
||||
/***** Visible icon to expand folder *****/
|
||||
Brw_PutIconToExpandFolder (FileBrowserId,RowId,
|
||||
false); // Visible
|
||||
Cns_VISIBLE);
|
||||
|
||||
/***** Hidden icon to contract folder *****/
|
||||
Brw_PutIconToContractFolder (FileBrowserId,RowId,
|
||||
true); // Hidden
|
||||
Cns_HIDDEN);
|
||||
break;
|
||||
case Brw_ICON_TREE_CONTRACT:
|
||||
/***** Hidden icon to expand folder *****/
|
||||
Brw_PutIconToExpandFolder (FileBrowserId,RowId,
|
||||
true); // Hidden
|
||||
Cns_HIDDEN);
|
||||
|
||||
/***** Visible icon to contract folder *****/
|
||||
Brw_PutIconToContractFolder (FileBrowserId,RowId,
|
||||
false); // Visible
|
||||
Cns_VISIBLE);
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
@ -4495,17 +4468,22 @@ static void Brw_IndentDependingOnLevel (unsigned Level)
|
|||
/*****************************************************************************/
|
||||
|
||||
static void Brw_PutIconToExpandFolder (const char *FileBrowserId,const char *RowId,
|
||||
bool Hidden)
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible)
|
||||
{
|
||||
char JavaScriptFuncToExpandFolder[256 + Brw_MAX_ROW_ID];
|
||||
|
||||
/***** Begin container *****/
|
||||
if (Hidden)
|
||||
HTM_DIV_Begin ("id=\"expand_%s_%s\" style=\"display:none;\"",
|
||||
FileBrowserId,RowId);
|
||||
else
|
||||
HTM_DIV_Begin ("id=\"expand_%s_%s\"",
|
||||
FileBrowserId,RowId);
|
||||
switch (HiddenOrVisible)
|
||||
{
|
||||
case Cns_HIDDEN:
|
||||
HTM_DIV_Begin ("id=\"expand_%s_%s\" class=\"NOT_SHOWN\"",
|
||||
FileBrowserId,RowId);
|
||||
break;
|
||||
case Cns_VISIBLE:
|
||||
HTM_DIV_Begin ("id=\"expand_%s_%s\"",
|
||||
FileBrowserId,RowId);
|
||||
break;
|
||||
}
|
||||
|
||||
/***** Form and icon *****/
|
||||
snprintf (JavaScriptFuncToExpandFolder,sizeof (JavaScriptFuncToExpandFolder),
|
||||
|
@ -4528,17 +4506,22 @@ static void Brw_PutIconToExpandFolder (const char *FileBrowserId,const char *Row
|
|||
/*****************************************************************************/
|
||||
|
||||
static void Brw_PutIconToContractFolder (const char *FileBrowserId,const char *RowId,
|
||||
bool Hidden)
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible)
|
||||
{
|
||||
char JavaScriptFuncToContractFolder[256 + Brw_MAX_ROW_ID];
|
||||
|
||||
/***** Begin container *****/
|
||||
if (Hidden)
|
||||
HTM_DIV_Begin ("id=\"contract_%s_%s\" style=\"display:none;\"",
|
||||
FileBrowserId,RowId);
|
||||
else
|
||||
HTM_DIV_Begin ("id=\"contract_%s_%s\"",
|
||||
FileBrowserId,RowId);
|
||||
switch (HiddenOrVisible)
|
||||
{
|
||||
case Cns_HIDDEN:
|
||||
HTM_DIV_Begin ("id=\"contract_%s_%s\" style=\"display:none;\"",
|
||||
FileBrowserId,RowId);
|
||||
break;
|
||||
case Cns_VISIBLE:
|
||||
HTM_DIV_Begin ("id=\"contract_%s_%s\"",
|
||||
FileBrowserId,RowId);
|
||||
break;
|
||||
}
|
||||
|
||||
/***** Form and icon *****/
|
||||
snprintf (JavaScriptFuncToContractFolder,sizeof (JavaScriptFuncToContractFolder),
|
||||
|
@ -4560,12 +4543,46 @@ static void Brw_PutIconToContractFolder (const char *FileBrowserId,const char *R
|
|||
/************* Put link and icon to hide/unhide file or folder ***************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static void Brw_PutIconHideUnhide (const char *Anchor,bool RowSetAsHidden)
|
||||
static void Brw_PutIconHideUnhide (const char *Anchor,
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible)
|
||||
{
|
||||
static const Act_Action_t Brw_ActHideUnhide[Brw_NUM_TYPES_FILE_BROWSER][Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Brw_UNKNOWN ] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_SHOW_DOC_CRS] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_SHOW_MRK_CRS] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_DOC_CRS] = {[Cns_HIDDEN] = ActUnhDocCrs ,[Cns_VISIBLE] = ActHidDocCrs },
|
||||
[Brw_ADMI_SHR_CRS] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_SHR_GRP] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_WRK_USR] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_WRK_CRS] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_MRK_CRS] = {[Cns_HIDDEN] = ActUnhMrkCrs ,[Cns_VISIBLE] = ActHidMrkCrs },
|
||||
[Brw_ADMI_BRF_USR] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_SHOW_DOC_GRP] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_DOC_GRP] = {[Cns_HIDDEN] = ActUnhDocGrp ,[Cns_VISIBLE] = ActHidDocGrp },
|
||||
[Brw_SHOW_MRK_GRP] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_MRK_GRP] = {[Cns_HIDDEN] = ActUnhMrkGrp ,[Cns_VISIBLE] = ActHidMrkGrp },
|
||||
[Brw_ADMI_ASG_USR] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_ASG_CRS] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_SHOW_DOC_DEG] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_DOC_DEG] = {[Cns_HIDDEN] = ActUnhDocDeg ,[Cns_VISIBLE] = ActHidDocDeg },
|
||||
[Brw_SHOW_DOC_CTR] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_DOC_CTR] = {[Cns_HIDDEN] = ActUnhDocCtr ,[Cns_VISIBLE] = ActHidDocCtr },
|
||||
[Brw_SHOW_DOC_INS] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_DOC_INS] = {[Cns_HIDDEN] = ActUnhDocIns ,[Cns_VISIBLE] = ActHidDocIns },
|
||||
[Brw_ADMI_SHR_DEG] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_SHR_CTR] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_SHR_INS] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_TCH_CRS] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_TCH_GRP] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_DOC_PRJ] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
[Brw_ADMI_ASS_PRJ] = {[Cns_HIDDEN] = ActUnk ,[Cns_VISIBLE] = ActUnk },
|
||||
};
|
||||
|
||||
HTM_TD_Begin ("class=\"BM %s\"",The_GetColorRows ());
|
||||
Ico_PutContextualIconToHideUnhide (Brw_ActHideUnhide[Gbl.FileBrowser.Type],Anchor,
|
||||
Brw_PutImplicitParsFileBrowser,&Gbl.FileBrowser.FilFolLnk,
|
||||
RowSetAsHidden);
|
||||
HiddenOrVisible);
|
||||
HTM_TD_End ();
|
||||
}
|
||||
|
||||
|
@ -4634,24 +4651,24 @@ static void Brw_PutIconFolder (unsigned Level,
|
|||
/***** Visible icon with folder closed *****/
|
||||
Brw_PutIconFolderWithoutPlus (FileBrowserId,RowId,
|
||||
false, // Closed
|
||||
false); // Visible
|
||||
Cns_VISIBLE);
|
||||
|
||||
/***** Hidden icon with folder open *****/
|
||||
Brw_PutIconFolderWithoutPlus (FileBrowserId,RowId,
|
||||
true, // Open
|
||||
true); // Hidden
|
||||
Cns_HIDDEN);
|
||||
}
|
||||
else
|
||||
{
|
||||
/***** Hidden icon with folder closed *****/
|
||||
Brw_PutIconFolderWithoutPlus (FileBrowserId,RowId,
|
||||
false, // Closed
|
||||
true); // Hidden
|
||||
Cns_HIDDEN);
|
||||
|
||||
/***** Visible icon with folder open *****/
|
||||
Brw_PutIconFolderWithoutPlus (FileBrowserId,RowId,
|
||||
true, // Open
|
||||
false); // Visible
|
||||
Cns_VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4664,18 +4681,21 @@ static void Brw_PutIconFolder (unsigned Level,
|
|||
/*****************************************************************************/
|
||||
|
||||
static void Brw_PutIconFolderWithoutPlus (const char *FileBrowserId,const char *RowId,
|
||||
bool Open,bool Hidden)
|
||||
bool Open,Cns_HiddenOrVisible_t HiddenOrVisible)
|
||||
{
|
||||
extern const char *Txt_Folder;
|
||||
static const char *Class[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "NOT_SHOWN ",
|
||||
[Cns_VISIBLE] = "",
|
||||
};
|
||||
|
||||
/***** 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 ? "open" :
|
||||
"closed",
|
||||
FileBrowserId,RowId,
|
||||
The_GetColorRows (),
|
||||
Hidden ? " style=\"display:none;\"" :
|
||||
"");
|
||||
Class[HiddenOrVisible],The_GetColorRows ());
|
||||
|
||||
/***** Icon *****/
|
||||
Ico_PutIcon (Open ? "folder-open-yellow.png" :
|
||||
|
@ -4692,16 +4712,20 @@ static void Brw_PutIconFolderWithoutPlus (const char *FileBrowserId,const char *
|
|||
/*****************************************************************************/
|
||||
|
||||
static void Brw_PutIconFolderWithPlus (const char *FileBrowserId,const char *RowId,
|
||||
bool Open,bool Hidden)
|
||||
bool Open,Cns_HiddenOrVisible_t HiddenOrVisible)
|
||||
{
|
||||
static const char *Class[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "NOT_SHOWN ",
|
||||
[Cns_VISIBLE] = "",
|
||||
};
|
||||
|
||||
/***** 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 ? "open" :
|
||||
"closed",
|
||||
FileBrowserId,RowId,
|
||||
The_GetColorRows (),
|
||||
Hidden ? " style=\"display:none;\"" :
|
||||
"");
|
||||
Class[HiddenOrVisible],The_GetColorRows ());
|
||||
|
||||
/***** Form and icon *****/
|
||||
Ico_PutContextualIconToCreateInFolder (Brw_ActFormCreate[Gbl.FileBrowser.Type],
|
||||
|
@ -7427,11 +7451,12 @@ void Brw_SetDocumentAsHidden (void)
|
|||
/** Check if a file / folder from the documents zone is set as hidden in DB **/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Brw_FileType_t FileType,const char *Path)
|
||||
Cns_HiddenOrVisible_t Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Brw_FileType_t FileType,
|
||||
const char *Path)
|
||||
{
|
||||
MYSQL_RES *mysql_res;
|
||||
MYSQL_ROW row;
|
||||
bool IsHidden = false;
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible;
|
||||
|
||||
/***** Get if a file or folder is hidden from database *****/
|
||||
if (Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingPath (&mysql_res,Path))
|
||||
|
@ -7440,16 +7465,20 @@ bool Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Brw_FileType_t FileType,const cha
|
|||
row = mysql_fetch_row (mysql_res);
|
||||
|
||||
/* File is hidden? (row[0]) */
|
||||
IsHidden = (row[0][0] == 'Y');
|
||||
HiddenOrVisible = (row[0][0] == 'Y') ? Cns_HIDDEN :
|
||||
Cns_VISIBLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
Brw_DB_AddPath (-1L,FileType,
|
||||
Gbl.FileBrowser.FilFolLnk.Full,false,Brw_LICENSE_DEFAULT);
|
||||
HiddenOrVisible = Cns_VISIBLE;
|
||||
}
|
||||
|
||||
/***** Free structure that stores the query result *****/
|
||||
DB_FreeMySQLResult (&mysql_res);
|
||||
|
||||
return IsHidden;
|
||||
return HiddenOrVisible;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -8936,7 +8965,7 @@ static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level)
|
|||
if (Gbl.FileBrowser.Asg.AsgCod <= 0) // If folder does not correspond to any assignment
|
||||
return true; // Folder can be removed or renamed
|
||||
|
||||
if (Gbl.FileBrowser.Asg.Hidden) // If assignment is hidden
|
||||
if (Gbl.FileBrowser.Asg.HiddenOrVisible == Cns_HIDDEN)
|
||||
return false; // Do not edit anything in hidden assigments
|
||||
|
||||
if (Gbl.FileBrowser.FilFolLnk.Type == Brw_IS_FOLDER && // The main folder of an assignment
|
||||
|
@ -9023,7 +9052,7 @@ static bool Brw_CheckIfICanCreateIntoFolder (unsigned Level)
|
|||
if (Gbl.FileBrowser.Asg.AsgCod <= 0) // If folder does not correspond to any assignment
|
||||
return false; // Do not create anything out of assignments
|
||||
|
||||
if (Gbl.FileBrowser.Asg.Hidden) // If assignment is hidden
|
||||
if (Gbl.FileBrowser.Asg.HiddenOrVisible == Cns_HIDDEN)
|
||||
return false; // Do not create anything in hidden assigments
|
||||
|
||||
if (!Gbl.FileBrowser.Asg.IBelongToCrsOrGrps) // If I do not belong to course / groups of this assignment
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
|
||||
#include <linux/limits.h> // For PATH_MAX
|
||||
|
||||
#include "swad_constant.h"
|
||||
#include "swad_course.h"
|
||||
#include "swad_form.h"
|
||||
#include "swad_group.h"
|
||||
|
@ -219,7 +220,8 @@ void Brw_RcvFileInFileBrwClassic (void);
|
|||
void Brw_RecLinkFileBrowser (void);
|
||||
void Brw_SetDocumentAsVisible (void);
|
||||
void Brw_SetDocumentAsHidden (void);
|
||||
bool Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Brw_FileType_t FileType,const char *Path);
|
||||
Cns_HiddenOrVisible_t Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Brw_FileType_t FileType,
|
||||
const char *Path);
|
||||
void Brw_ShowFileMetadata (void);
|
||||
|
||||
void Brw_GetLinkToDownloadFile (const char *PathInTree,const char *FileName,char *URL);
|
||||
|
|
|
@ -1472,10 +1472,10 @@ static void Cfe_ShowCallForExam (struct Cfe_CallsForExams *CallsForExams,
|
|||
|
||||
static void Cfe_PutIconsCallForExam (void *CallsForExams)
|
||||
{
|
||||
static Act_Action_t ActionHideUnhide[2] =
|
||||
static Act_Action_t ActionHideUnhide[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = ActHidCfe, // Visible ==> action to hide
|
||||
[true ] = ActUnhCfe, // Hidden ==> action to unhide
|
||||
[Cns_HIDDEN ] = ActUnhCfe, // Hidden ==> action to unhide
|
||||
[Cns_VISIBLE] = ActHidCfe, // Visible ==> action to hide
|
||||
};
|
||||
|
||||
if (CallsForExams)
|
||||
|
|
|
@ -629,10 +629,11 @@ TODO: Emilce Barrera Mesa: Podr
|
|||
TODO: Emilce Barrera Mesa: Mis estudiantes presentan muchas dificultades a la hora de poner la foto porque la plataforma es muy exigente respecto al fondo de la imagen.
|
||||
|
||||
*/
|
||||
#define Log_PLATFORM_VERSION "SWAD 22.118.13 (2023-05-31)"
|
||||
#define Log_PLATFORM_VERSION "SWAD 22.119 (2023-06-06)"
|
||||
#define CSS_FILE "swad22.118.5.css"
|
||||
#define JS_FILE "swad22.49.js"
|
||||
/*
|
||||
Version 22.119: Jun 06, 2023 Code refactoring related to hidden-visible. (337588 lines)
|
||||
Version 22.118.13:May 31, 2023 Code refactoring in forums. (337417 lines)
|
||||
Version 22.118.12:May 30, 2023 Code refactoring in forums and messages. (337408 lines)
|
||||
Version 22.118.11:May 30, 2023 Code refactoring in strings. (337391 lines)
|
||||
|
|
|
@ -126,4 +126,11 @@ typedef enum
|
|||
Cns_ENABLED,
|
||||
} Cns_DisabledOrEnabled_t;
|
||||
|
||||
#define Cns_NUM_HIDDEN_VISIBLE 2
|
||||
typedef enum
|
||||
{
|
||||
Cns_HIDDEN,
|
||||
Cns_VISIBLE,
|
||||
} Cns_HiddenOrVisible_t;
|
||||
|
||||
#endif
|
||||
|
|
17
swad_date.c
17
swad_date.c
|
@ -57,17 +57,14 @@ extern struct Globals Gbl;
|
|||
/***************************** Public constants ******************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
const char *Dat_TimeStatusClassVisible[Dat_NUM_TIME_STATUS] =
|
||||
const char *Dat_TimeStatusClass[Dat_NUM_TIME_STATUS][Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Dat_PAST ] = "DATE_RED",
|
||||
[Dat_PRESENT] = "DATE_GREEN",
|
||||
[Dat_FUTURE ] = "DATE_BLUE",
|
||||
};
|
||||
const char *Dat_TimeStatusClassHidden[Dat_NUM_TIME_STATUS] =
|
||||
{
|
||||
[Dat_PAST ] = "DATE_RED_LIGHT",
|
||||
[Dat_PRESENT] = "DATE_GREEN_LIGHT",
|
||||
[Dat_FUTURE ] = "DATE_BLUE_LIGHT",
|
||||
[Dat_PAST ][Cns_HIDDEN ] = "DATE_RED_LIGHT",
|
||||
[Dat_PAST ][Cns_VISIBLE] = "DATE_RED",
|
||||
[Dat_PRESENT][Cns_HIDDEN ] = "DATE_GREEN_LIGHT",
|
||||
[Dat_PRESENT][Cns_VISIBLE] = "DATE_GREEN",
|
||||
[Dat_FUTURE ][Cns_HIDDEN ] = "DATE_BLUE_LIGHT",
|
||||
[Dat_FUTURE ][Cns_VISIBLE] = "DATE_BLUE",
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
67
swad_exam.c
67
swad_exam.c
|
@ -183,7 +183,7 @@ void Exa_ResetExam (struct Exa_Exam *Exam)
|
|||
Exam->TimeUTC[Dat_STR_TIME] = (time_t) 0;
|
||||
Exam->TimeUTC[Dat_END_TIME] = (time_t) 0;
|
||||
Exam->Title[0] = '\0';
|
||||
Exam->Hidden = false;
|
||||
Exam->HiddenOrVisible = Cns_VISIBLE;
|
||||
Exam->NumSets = 0;
|
||||
Exam->NumQsts = 0;
|
||||
Exam->NumSess = 0;
|
||||
|
@ -455,11 +455,36 @@ static void Exa_ShowOneExam (struct Exa_Exams *Exams,bool ShowOnlyThisExam)
|
|||
extern const char *Txt_Maximum_grade;
|
||||
extern const char *Txt_Result_visibility;
|
||||
extern const char *Txt_Sessions;
|
||||
static const char *DateGreenClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DATE_GREEN_LIGHT",
|
||||
[Cns_VISIBLE] = "DATE_GREEN",
|
||||
};
|
||||
static const char *DateRedClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DATE_RED_LIGHT",
|
||||
[Cns_VISIBLE] = "DATE_RED",
|
||||
};
|
||||
static const char *TitleClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "ASG_TITLE_LIGHT",
|
||||
[Cns_VISIBLE] = "ASG_TITLE",
|
||||
};
|
||||
static const char *GroupClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "ASG_GRP_LIGHT",
|
||||
[Cns_VISIBLE] = "ASG_GRP",
|
||||
};
|
||||
static const char *DataClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DAT_LIGHT",
|
||||
[Cns_VISIBLE] = "DAT",
|
||||
};
|
||||
char *Anchor;
|
||||
static unsigned UniqueId = 0;
|
||||
char *Id;
|
||||
Dat_StartEndTime_t StartEndTime;
|
||||
const char *Color;
|
||||
const char *DateClass;
|
||||
char Txt[Cns_MAX_BYTES_TEXT + 1];
|
||||
|
||||
/***** Build anchor string *****/
|
||||
|
@ -489,16 +514,14 @@ static void Exa_ShowOneExam (struct Exa_Exams *Exams,bool ShowOnlyThisExam)
|
|||
{
|
||||
if (asprintf (&Id,"exa_date_%u_%u",(unsigned) StartEndTime,UniqueId) < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
Color = Exams->Exam.NumOpenSess ? (Exams->Exam.Hidden ? "DATE_GREEN_LIGHT":
|
||||
"DATE_GREEN") :
|
||||
(Exams->Exam.Hidden ? "DATE_RED_LIGHT":
|
||||
"DATE_RED");
|
||||
DateClass = Exams->Exam.NumOpenSess ? DateGreenClass[Exams->Exam.HiddenOrVisible] :
|
||||
DateRedClass[Exams->Exam.HiddenOrVisible];
|
||||
if (ShowOnlyThisExam)
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"",
|
||||
Id,Color,The_GetSuffix ());
|
||||
Id,DateClass,The_GetSuffix ());
|
||||
else
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
|
||||
Id,Color,The_GetSuffix (),The_GetColorRows ());
|
||||
Id,DateClass,The_GetSuffix (),The_GetColorRows ());
|
||||
if (Exams->Exam.TimeUTC[Dat_STR_TIME])
|
||||
Dat_WriteLocalDateHMSFromUTC (Id,Exams->Exam.TimeUTC[StartEndTime],
|
||||
Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK,
|
||||
|
@ -518,8 +541,7 @@ static void Exa_ShowOneExam (struct Exa_Exams *Exams,bool ShowOnlyThisExam)
|
|||
Frm_BeginForm (ActSeeOneExa);
|
||||
Exa_PutPars (Exams);
|
||||
HTM_BUTTON_Submit_Begin (Txt_View_exam,"class=\"LT BT_LINK %s_%s\"",
|
||||
Exams->Exam.Hidden ? "ASG_TITLE_LIGHT":
|
||||
"ASG_TITLE",
|
||||
TitleClass[Exams->Exam.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Exams->Exam.Title);
|
||||
HTM_BUTTON_End ();
|
||||
|
@ -528,8 +550,7 @@ static void Exa_ShowOneExam (struct Exa_Exams *Exams,bool ShowOnlyThisExam)
|
|||
|
||||
/* Number of questions, maximum grade, visibility of results */
|
||||
HTM_DIV_Begin ("class=\"%s_%s\"",
|
||||
Exams->Exam.Hidden ? "ASG_GRP_LIGHT" :
|
||||
"ASG_GRP",
|
||||
GroupClass[Exams->Exam.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_TxtColonNBSP (Txt_Sets_of_questions);
|
||||
HTM_Unsigned (Exams->Exam.NumSets);
|
||||
|
@ -538,7 +559,8 @@ static void Exa_ShowOneExam (struct Exa_Exams *Exams,bool ShowOnlyThisExam)
|
|||
HTM_Double (Exams->Exam.MaxGrade);
|
||||
HTM_BR ();
|
||||
HTM_TxtColonNBSP (Txt_Result_visibility);
|
||||
TstVis_ShowVisibilityIcons (Exams->Exam.Visibility,Exams->Exam.Hidden);
|
||||
TstVis_ShowVisibilityIcons (Exams->Exam.Visibility,
|
||||
Exams->Exam.HiddenOrVisible);
|
||||
HTM_DIV_End ();
|
||||
|
||||
/***** Number of sessions in exam *****/
|
||||
|
@ -550,8 +572,7 @@ static void Exa_ShowOneExam (struct Exa_Exams *Exams,bool ShowOnlyThisExam)
|
|||
Frm_BeginForm (ActSeeOneExa);
|
||||
Exa_PutPars (Exams);
|
||||
HTM_BUTTON_Submit_Begin (Txt_Sessions,"class=\"LT BT_LINK %s_%s\"",
|
||||
Exams->Exam.Hidden ? "ASG_TITLE_LIGHT":
|
||||
"ASG_TITLE",
|
||||
TitleClass[Exams->Exam.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
if (ShowOnlyThisExam)
|
||||
HTM_TxtColonNBSP (Txt_Sessions);
|
||||
|
@ -587,8 +608,7 @@ static void Exa_ShowOneExam (struct Exa_Exams *Exams,bool ShowOnlyThisExam)
|
|||
Txt,Cns_MAX_BYTES_TEXT,Str_DONT_REMOVE_SPACES);
|
||||
ALn_InsertLinks (Txt,Cns_MAX_BYTES_TEXT,60); // Insert links
|
||||
HTM_DIV_Begin ("class=\"PAR %s_%s\"",
|
||||
Exams->Exam.Hidden ? "DAT_LIGHT" :
|
||||
"DAT",
|
||||
DataClass[Exams->Exam.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt);
|
||||
HTM_DIV_End ();
|
||||
|
@ -642,7 +662,7 @@ static void Exa_PutIconsEditingOneExam (void *Exams)
|
|||
|
||||
static void Exa_WriteAuthor (struct Exa_Exam *Exam)
|
||||
{
|
||||
Usr_WriteAuthor1Line (Exam->UsrCod,Exam->Hidden);
|
||||
Usr_WriteAuthor1Line (Exam->UsrCod,Exam->HiddenOrVisible);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -661,10 +681,10 @@ static void Exa_PutParExamOrder (Exa_Order_t SelectedOrder)
|
|||
static void Exa_PutIconsToRemEditOneExam (struct Exa_Exams *Exams,
|
||||
const char *Anchor)
|
||||
{
|
||||
static Act_Action_t ActionHideUnhide[2] =
|
||||
static Act_Action_t ActionHideUnhide[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = ActHidExa, // Visible ==> action to hide
|
||||
[true ] = ActUnhExa, // Hidden ==> action to unhide
|
||||
[Cns_HIDDEN ] = ActUnhExa, // Hidden ==> action to unhide
|
||||
[Cns_VISIBLE] = ActHidExa, // Visible ==> action to hide
|
||||
};
|
||||
static const Act_Action_t ActionShowResults[Rol_NUM_ROLES] =
|
||||
{
|
||||
|
@ -683,7 +703,7 @@ static void Exa_PutIconsToRemEditOneExam (struct Exa_Exams *Exams,
|
|||
/***** Icon to hide/unhide exam *****/
|
||||
Ico_PutContextualIconToHideUnhide (ActionHideUnhide,Anchor,
|
||||
Exa_PutPars,Exams,
|
||||
Exams->Exam.Hidden);
|
||||
Exams->Exam.HiddenOrVisible);
|
||||
|
||||
/***** Icon to edit exam *****/
|
||||
Ico_PutContextualIconToEdit (ActEdiOneExa,NULL,
|
||||
|
@ -894,7 +914,8 @@ void Exa_GetExamDataByCod (struct Exa_Exam *Exam)
|
|||
Exam->CrsCod = Str_ConvertStrCodToLongCod (row[1]);
|
||||
|
||||
/* Get whether the exam is hidden (row[2]) */
|
||||
Exam->Hidden = (row[2][0] == 'Y');
|
||||
Exam->HiddenOrVisible = (row[2][0] == 'Y') ? Cns_HIDDEN :
|
||||
Cns_VISIBLE;
|
||||
|
||||
/* Get author of the exam (row[3]) */
|
||||
Exam->UsrCod = Str_ConvertStrCodToLongCod (row[3]);
|
||||
|
|
|
@ -1303,8 +1303,8 @@ long Exa_DB_CreateSession (const struct ExaSes_Session *Session)
|
|||
"'%s'," // Title
|
||||
"'N')", // ShowUsrResults: Don't show user results initially
|
||||
Session->ExaCod,
|
||||
Session->Hidden ? 'Y' :
|
||||
'N',
|
||||
Session->HiddenOrVisible == Cns_HIDDEN ? 'Y' :
|
||||
'N',
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod, // Session creator
|
||||
Session->TimeUTC[Dat_STR_TIME], // Start time
|
||||
Session->TimeUTC[Dat_END_TIME], // End time
|
||||
|
@ -1330,8 +1330,8 @@ void Exa_DB_UpdateSession (const struct ExaSes_Session *Session)
|
|||
" AND exa_sessions.ExaCod=%ld" // Extra check
|
||||
" AND exa_sessions.ExaCod=exa_exams.ExaCod"
|
||||
" AND exa_exams.CrsCod=%ld", // Extra check
|
||||
Session->Hidden ? 'Y' :
|
||||
'N',
|
||||
Session->HiddenOrVisible == Cns_HIDDEN ? 'Y' :
|
||||
'N',
|
||||
Session->TimeUTC[Dat_STR_TIME], // Start time
|
||||
Session->TimeUTC[Dat_END_TIME], // End time
|
||||
Session->Title,
|
||||
|
|
|
@ -1408,10 +1408,10 @@ static void ExaRes_CheckIfICanViewResult (const struct Exa_Exam *Exam,
|
|||
{
|
||||
case Rol_STD:
|
||||
// Depends on visibility of exam, session and result (eye icons)
|
||||
ICanView->Result = (Usr_ItsMe (UsrCod) == Usr_ME && // The result is mine
|
||||
!Exam->Hidden && // The exam is visible
|
||||
!Session->Hidden && // The session is visible
|
||||
Session->ShowUsrResults); // The results of the session are visible to users
|
||||
ICanView->Result = (Usr_ItsMe (UsrCod) == Usr_ME && // The result is mine
|
||||
Exam->HiddenOrVisible == Cns_VISIBLE && // The exam is visible
|
||||
Session->HiddenOrVisible == Cns_VISIBLE && // The session is visible
|
||||
Session->ShowUsrResults); // The results of the session are visible to users
|
||||
// Whether I belong or not to groups of session is not checked here...
|
||||
// ...because I should be able to see old exams made in old groups to which I belonged
|
||||
|
||||
|
|
|
@ -123,7 +123,7 @@ void ExaSes_ResetSession (struct ExaSes_Session *Session)
|
|||
StartEndTime++)
|
||||
Session->TimeUTC[StartEndTime] = (time_t) 0;
|
||||
Session->Title[0] = '\0';
|
||||
Session->Hidden = false;
|
||||
Session->HiddenOrVisible = Cns_VISIBLE;
|
||||
Session->Open = false;
|
||||
Session->ShowUsrResults = false;
|
||||
};
|
||||
|
@ -426,10 +426,10 @@ static void ExaSes_ListOneOrMoreSessionsIcons (struct Exa_Exams *Exams,
|
|||
const struct ExaSes_Session *Session,
|
||||
const char *Anchor)
|
||||
{
|
||||
static Act_Action_t ActionHideUnhide[2] =
|
||||
static Act_Action_t ActionHideUnhide[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = ActHidExaSes, // Visible ==> action to hide
|
||||
[true ] = ActUnhExaSes, // Hidden ==> action to unhide
|
||||
[Cns_HIDDEN ] = ActUnhExaSes, // Hidden ==> action to unhide
|
||||
[Cns_VISIBLE] = ActHidExaSes, // Visible ==> action to hide
|
||||
};
|
||||
|
||||
Exams->Exam.ExaCod = Session->ExaCod;
|
||||
|
@ -447,7 +447,7 @@ static void ExaSes_ListOneOrMoreSessionsIcons (struct Exa_Exams *Exams,
|
|||
/***** Icon to hide/unhide the exam session *****/
|
||||
Ico_PutContextualIconToHideUnhide (ActionHideUnhide,Anchor,
|
||||
ExaSes_PutParsEdit,Exams,
|
||||
Session->Hidden);
|
||||
Session->HiddenOrVisible);
|
||||
|
||||
/***** Icon to edit the exam session *****/
|
||||
Ico_PutContextualIconToEdit (ActEdiOneExaSes,Anchor,
|
||||
|
@ -466,7 +466,7 @@ static void ExaSes_ListOneOrMoreSessionsAuthor (const struct ExaSes_Session *Ses
|
|||
{
|
||||
/***** Session author (teacher) *****/
|
||||
HTM_TD_Begin ("class=\"LT %s\"",The_GetColorRows ());
|
||||
Usr_WriteAuthor1Line (Session->UsrCod,Session->Hidden);
|
||||
Usr_WriteAuthor1Line (Session->UsrCod,Session->HiddenOrVisible);
|
||||
HTM_TD_End ();
|
||||
}
|
||||
|
||||
|
@ -477,23 +477,31 @@ static void ExaSes_ListOneOrMoreSessionsAuthor (const struct ExaSes_Session *Ses
|
|||
static void ExaSes_ListOneOrMoreSessionsTimes (const struct ExaSes_Session *Session,
|
||||
unsigned UniqueId)
|
||||
{
|
||||
static const char *DateGreenClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DATE_GREEN_LIGHT",
|
||||
[Cns_VISIBLE] = "DATE_GREEN",
|
||||
};
|
||||
static const char *DateRedClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DATE_RED_LIGHT",
|
||||
[Cns_VISIBLE] = "DATE_RED",
|
||||
};
|
||||
Dat_StartEndTime_t StartEndTime;
|
||||
const char *Color;
|
||||
const char *DateClass;
|
||||
char *Id;
|
||||
|
||||
for (StartEndTime = (Dat_StartEndTime_t) 0;
|
||||
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
|
||||
StartEndTime++)
|
||||
{
|
||||
Color = Session->Open ? (Session->Hidden ? "DATE_GREEN_LIGHT":
|
||||
"DATE_GREEN") :
|
||||
(Session->Hidden ? "DATE_RED_LIGHT":
|
||||
"DATE_RED");
|
||||
DateClass = Session->Open ? DateGreenClass[Session->HiddenOrVisible] :
|
||||
DateRedClass[Session->HiddenOrVisible];
|
||||
|
||||
if (asprintf (&Id,"exa_time_%u_%u",(unsigned) StartEndTime,UniqueId) < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
|
||||
Id,Color,The_GetSuffix (),The_GetColorRows ());
|
||||
Id,DateClass,The_GetSuffix (),The_GetColorRows ());
|
||||
Dat_WriteLocalDateHMSFromUTC (Id,Session->TimeUTC[StartEndTime],
|
||||
Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK,
|
||||
true,true,true,0x6);
|
||||
|
@ -512,6 +520,11 @@ static void ExaSes_ListOneOrMoreSessionsTitleGrps (struct Exa_Exams *Exams,
|
|||
{
|
||||
extern const char *Txt_Play;
|
||||
extern const char *Txt_Resume;
|
||||
static const char *TitleClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "ASG_TITLE_LIGHT",
|
||||
[Cns_VISIBLE] = "ASG_TITLE",
|
||||
};
|
||||
|
||||
HTM_TD_Begin ("class=\"LT %s\"",The_GetColorRows ());
|
||||
|
||||
|
@ -525,8 +538,7 @@ static void ExaSes_ListOneOrMoreSessionsTitleGrps (struct Exa_Exams *Exams,
|
|||
HTM_BUTTON_Submit_Begin (Gbl.Usrs.Me.Role.Logged == Rol_STD ? Txt_Play :
|
||||
Txt_Resume,
|
||||
"class=\"LT BT_LINK %s_%s\"",
|
||||
Session->Hidden ? "ASG_TITLE_LIGHT" :
|
||||
"ASG_TITLE",
|
||||
TitleClass[Session->HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Session->Title);
|
||||
HTM_BUTTON_End ();
|
||||
|
@ -535,8 +547,7 @@ static void ExaSes_ListOneOrMoreSessionsTitleGrps (struct Exa_Exams *Exams,
|
|||
else
|
||||
{
|
||||
HTM_SPAN_Begin ("class=\"%s_%s\"",
|
||||
Session->Hidden ? "ASG_TITLE_LIGHT" :
|
||||
"ASG_TITLE",
|
||||
TitleClass[Session->HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Session->Title);
|
||||
HTM_SPAN_End ();
|
||||
|
@ -560,6 +571,11 @@ static void ExaSes_GetAndWriteNamesOfGrpsAssociatedToSession (const struct ExaSe
|
|||
extern const char *Txt_Groups;
|
||||
extern const char *Txt_and;
|
||||
extern const char *Txt_The_whole_course;
|
||||
static const char *GroupClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "ASG_GRP_LIGHT",
|
||||
[Cns_VISIBLE] = "ASG_GRP",
|
||||
};
|
||||
MYSQL_RES *mysql_res;
|
||||
MYSQL_ROW row;
|
||||
unsigned NumGrps;
|
||||
|
@ -570,9 +586,7 @@ static void ExaSes_GetAndWriteNamesOfGrpsAssociatedToSession (const struct ExaSe
|
|||
|
||||
/***** Write heading *****/
|
||||
HTM_DIV_Begin ("class=\"%s_%s\"",
|
||||
Session->Hidden ? "ASG_GRP_LIGHT":
|
||||
"ASG_GRP",
|
||||
The_GetSuffix ());
|
||||
GroupClass[Session->HiddenOrVisible],The_GetSuffix ());
|
||||
|
||||
HTM_TxtColonNBSP (NumGrps == 1 ? Txt_Group :
|
||||
Txt_Groups);
|
||||
|
@ -757,7 +771,8 @@ static void ExaSes_GetSessionDataFromRow (MYSQL_RES *mysql_res,
|
|||
Err_WrongExamExit ();
|
||||
|
||||
/* Get whether the session is hidden (row[2]) */
|
||||
Session->Hidden = (row[2][0] == 'Y');
|
||||
Session->HiddenOrVisible = (row[2][0] == 'Y') ? Cns_HIDDEN :
|
||||
Cns_VISIBLE;
|
||||
|
||||
/* Get session teacher (row[3]) */
|
||||
Session->UsrCod = Str_ConvertStrCodToLongCod (row[3]);
|
||||
|
@ -1261,8 +1276,8 @@ bool ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam,
|
|||
{
|
||||
/***** 1. Sessions in hidden exams are not accesible
|
||||
2. Hidden or closed sessions are not accesible *****/
|
||||
if (Exam->Hidden ||
|
||||
Session->Hidden ||
|
||||
if (Exam->HiddenOrVisible == Cns_HIDDEN ||
|
||||
Session->HiddenOrVisible == Cns_HIDDEN ||
|
||||
!Session->Open)
|
||||
return false;
|
||||
|
||||
|
|
|
@ -85,7 +85,7 @@ struct Exa_Exam
|
|||
unsigned Visibility; // Visibility of results
|
||||
char Title[Exa_MAX_BYTES_TITLE + 1];
|
||||
time_t TimeUTC[Dat_NUM_START_END_TIME];
|
||||
bool Hidden; // Exam is hidden
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible; // Exam is hidden or visible?
|
||||
unsigned NumSets; // Number of sets in the exam
|
||||
unsigned NumQsts; // Number of questions in the exam
|
||||
unsigned NumSess; // Number of sessions in the exam
|
||||
|
@ -146,7 +146,7 @@ struct ExaSes_Session
|
|||
long UsrCod;
|
||||
time_t TimeUTC[Dat_NUM_START_END_TIME];
|
||||
char Title[ExaSes_MAX_BYTES_TITLE + 1];
|
||||
bool Hidden;
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible;
|
||||
bool Open; // If now is between start and end dates
|
||||
bool ShowUsrResults; // Show exam with results of all questions for the student
|
||||
};
|
||||
|
|
69
swad_game.c
69
swad_game.c
|
@ -198,7 +198,7 @@ void Gam_ResetGame (struct Gam_Game *Game)
|
|||
Game->NumQsts = 0;
|
||||
Game->NumMchs = 0;
|
||||
Game->NumUnfinishedMchs = 0;
|
||||
Game->Hidden = false;
|
||||
Game->HiddenOrVisible = Cns_VISIBLE;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -499,11 +499,36 @@ static void Gam_ShowGameMainData (struct Gam_Games *Games,
|
|||
extern const char *Txt_Maximum_grade;
|
||||
extern const char *Txt_Result_visibility;
|
||||
extern const char *Txt_Matches;
|
||||
static const char *DateGreenClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DATE_GREEN_LIGHT",
|
||||
[Cns_VISIBLE] = "DATE_GREEN",
|
||||
};
|
||||
static const char *DateRedClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DATE_RED_LIGHT",
|
||||
[Cns_VISIBLE] = "DATE_RED",
|
||||
};
|
||||
static const char *TitleClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "ASG_TITLE_LIGHT",
|
||||
[Cns_VISIBLE] = "ASG_TITLE",
|
||||
};
|
||||
static const char *GroupClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "ASG_GRP_LIGHT",
|
||||
[Cns_VISIBLE] = "ASG_GRP",
|
||||
};
|
||||
static const char *DataClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DAT_LIGHT",
|
||||
[Cns_VISIBLE] = "DAT",
|
||||
};
|
||||
char *Anchor = NULL;
|
||||
static unsigned UniqueId = 0;
|
||||
char *Id;
|
||||
Dat_StartEndTime_t StartEndTime;
|
||||
const char *Color;
|
||||
const char *DateClass;
|
||||
char Txt[Cns_MAX_BYTES_TEXT + 1];
|
||||
|
||||
/***** Set anchor string *****/
|
||||
|
@ -533,16 +558,14 @@ static void Gam_ShowGameMainData (struct Gam_Games *Games,
|
|||
{
|
||||
if (asprintf (&Id,"gam_date_%u_%u",(unsigned) StartEndTime,UniqueId) < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
Color = Games->Game.NumUnfinishedMchs ? (Games->Game.Hidden ? "DATE_GREEN_LIGHT":
|
||||
"DATE_GREEN") :
|
||||
(Games->Game.Hidden ? "DATE_RED_LIGHT":
|
||||
"DATE_RED");
|
||||
DateClass = Games->Game.NumUnfinishedMchs ? DateGreenClass[Games->Game.HiddenOrVisible] :
|
||||
DateRedClass[Games->Game.HiddenOrVisible];
|
||||
if (ShowOnlyThisGame)
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"",
|
||||
Id,Color,The_GetSuffix ());
|
||||
Id,DateClass,The_GetSuffix ());
|
||||
else
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
|
||||
Id,Color,The_GetSuffix (),The_GetColorRows ());
|
||||
Id,DateClass,The_GetSuffix (),The_GetColorRows ());
|
||||
if (Games->Game.TimeUTC[Dat_STR_TIME])
|
||||
Dat_WriteLocalDateHMSFromUTC (Id,Games->Game.TimeUTC[StartEndTime],
|
||||
Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK,
|
||||
|
@ -562,8 +585,7 @@ static void Gam_ShowGameMainData (struct Gam_Games *Games,
|
|||
Frm_BeginForm (ActSeeOneGam);
|
||||
Gam_PutPars (Games);
|
||||
HTM_BUTTON_Submit_Begin (Txt_View_game,"class=\"LT BT_LINK %s_%s\"",
|
||||
Games->Game.Hidden ? "ASG_TITLE_LIGHT":
|
||||
"ASG_TITLE",
|
||||
TitleClass[Games->Game.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Games->Game.Title);
|
||||
HTM_BUTTON_End ();
|
||||
|
@ -572,9 +594,7 @@ static void Gam_ShowGameMainData (struct Gam_Games *Games,
|
|||
|
||||
/* Number of questions, maximum grade, visibility of results */
|
||||
HTM_DIV_Begin ("class=\"%s_%s\"",
|
||||
Games->Game.Hidden ? "ASG_GRP_LIGHT" :
|
||||
"ASG_GRP",
|
||||
The_GetSuffix ());
|
||||
GroupClass[Games->Game.HiddenOrVisible],The_GetSuffix ());
|
||||
HTM_TxtColonNBSP (Txt_Number_of_questions);
|
||||
HTM_Unsigned (Games->Game.NumQsts);
|
||||
HTM_BR ();
|
||||
|
@ -582,7 +602,8 @@ static void Gam_ShowGameMainData (struct Gam_Games *Games,
|
|||
HTM_Double (Games->Game.MaxGrade);
|
||||
HTM_BR ();
|
||||
HTM_TxtColonNBSP (Txt_Result_visibility);
|
||||
TstVis_ShowVisibilityIcons (Games->Game.Visibility,Games->Game.Hidden);
|
||||
TstVis_ShowVisibilityIcons (Games->Game.Visibility,
|
||||
Games->Game.HiddenOrVisible);
|
||||
HTM_DIV_End ();
|
||||
|
||||
/***** Number of matches in game *****/
|
||||
|
@ -594,8 +615,7 @@ static void Gam_ShowGameMainData (struct Gam_Games *Games,
|
|||
Frm_BeginForm (ActSeeOneGam);
|
||||
Gam_PutPars (Games);
|
||||
HTM_BUTTON_Submit_Begin (Txt_Matches,"class=\"LT BT_LINK %s_%s\"",
|
||||
Games->Game.Hidden ? "ASG_TITLE_LIGHT":
|
||||
"ASG_TITLE",
|
||||
TitleClass[Games->Game.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
if (ShowOnlyThisGame)
|
||||
HTM_TxtColonNBSP (Txt_Matches);
|
||||
|
@ -631,9 +651,7 @@ static void Gam_ShowGameMainData (struct Gam_Games *Games,
|
|||
Txt,Cns_MAX_BYTES_TEXT,Str_DONT_REMOVE_SPACES);
|
||||
ALn_InsertLinks (Txt,Cns_MAX_BYTES_TEXT,60); // Insert links
|
||||
HTM_DIV_Begin ("class=\"PAR %s_%s\"",
|
||||
Games->Game.Hidden ? "DAT_LIGHT" :
|
||||
"DAT",
|
||||
The_GetSuffix ());
|
||||
DataClass[Games->Game.HiddenOrVisible],The_GetSuffix ());
|
||||
HTM_Txt (Txt);
|
||||
HTM_DIV_End ();
|
||||
HTM_TD_End ();
|
||||
|
@ -686,7 +704,7 @@ static void Gam_PutIconsEditingOneGame (void *Games)
|
|||
|
||||
static void Gam_WriteAuthor (struct Gam_Game *Game)
|
||||
{
|
||||
Usr_WriteAuthor1Line (Game->UsrCod,Game->Hidden);
|
||||
Usr_WriteAuthor1Line (Game->UsrCod,Game->HiddenOrVisible);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -705,10 +723,10 @@ static void Gam_PutParGameOrder (Gam_Order_t SelectedOrder)
|
|||
static void Gam_PutIconsToRemEditOneGame (struct Gam_Games *Games,
|
||||
const char *Anchor)
|
||||
{
|
||||
static Act_Action_t ActionHideUnhide[2] =
|
||||
static Act_Action_t ActionHideUnhide[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = ActHidGam, // Visible ==> action to hide
|
||||
[true ] = ActUnhGam, // Hidden ==> action to unhide
|
||||
[Cns_HIDDEN ] = ActUnhGam, // Hidden ==> action to unhide
|
||||
[Cns_VISIBLE] = ActHidGam, // Visible ==> action to hide
|
||||
};
|
||||
static const Act_Action_t ActionShowResults[Rol_NUM_ROLES] =
|
||||
{
|
||||
|
@ -727,7 +745,7 @@ static void Gam_PutIconsToRemEditOneGame (struct Gam_Games *Games,
|
|||
/***** Icon to unhide/hide game *****/
|
||||
Ico_PutContextualIconToHideUnhide (ActionHideUnhide,Anchor,
|
||||
Gam_PutPars,Games,
|
||||
Games->Game.Hidden);
|
||||
Games->Game.HiddenOrVisible);
|
||||
|
||||
/***** Icon to edit game *****/
|
||||
Ico_PutContextualIconToEdit (ActEdiOneGam,NULL,
|
||||
|
@ -950,7 +968,8 @@ void Gam_GetGameDataByCod (struct Gam_Game *Game)
|
|||
Game->CrsCod = Str_ConvertStrCodToLongCod (row[1]);
|
||||
|
||||
/* Get whether the game is hidden (row[2]) */
|
||||
Game->Hidden = (row[2][0] == 'Y');
|
||||
Game->HiddenOrVisible = (row[2][0] == 'Y') ? Cns_HIDDEN :
|
||||
Cns_VISIBLE;
|
||||
|
||||
/* Get author of the game (row[3]) */
|
||||
Game->UsrCod = Str_ConvertStrCodToLongCod (row[3]);
|
||||
|
|
|
@ -79,7 +79,7 @@ struct Gam_Game
|
|||
unsigned Visibility; // Visibility of results
|
||||
char Title[Gam_MAX_BYTES_TITLE + 1];
|
||||
time_t TimeUTC[Dat_NUM_START_END_TIME];
|
||||
bool Hidden; // Game is hidden
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible; // Game is hidden or visible?
|
||||
unsigned NumQsts; // Number of questions in the game
|
||||
unsigned NumMchs; // Number of matches in the game
|
||||
unsigned NumUnfinishedMchs; // Number of unfinished matches in the game
|
||||
|
|
21
swad_icon.c
21
swad_icon.c
|
@ -296,24 +296,25 @@ void Ico_PutContextualIconToConfigure (Act_Action_t NextAction,
|
|||
"cog.svg",Ico_BLACK);
|
||||
}
|
||||
|
||||
void Ico_PutContextualIconToHideUnhide (const Act_Action_t NextAction[2],const char *Anchor,
|
||||
void Ico_PutContextualIconToHideUnhide (const Act_Action_t NextAction[Cns_NUM_HIDDEN_VISIBLE],
|
||||
const char *Anchor,
|
||||
void (*FuncPars) (void *Args),void *Args,
|
||||
bool Hidden)
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible)
|
||||
{
|
||||
static const char *Icon[2] =
|
||||
static const char *Icon[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = "eye.svg", // visible ==> icon to hide
|
||||
[true ] = "eye-slash.svg", // hidden ==> icon to unhide
|
||||
[Cns_HIDDEN ] = "eye-slash.svg", // hidden ==> icon to unhide
|
||||
[Cns_VISIBLE] = "eye.svg", // visible ==> icon to hide
|
||||
};
|
||||
static Ico_Color_t Color[2] =
|
||||
static Ico_Color_t Color[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = Ico_GREEN, // visible ==> green icon to hide
|
||||
[true ] = Ico_RED, // hidden ==> red icon to unhide
|
||||
[Cns_HIDDEN ] = Ico_RED, // hidden ==> red icon to unhide
|
||||
[Cns_VISIBLE] = Ico_GREEN, // visible ==> green icon to hide
|
||||
};
|
||||
|
||||
Lay_PutContextualLinkOnlyIcon (NextAction[Hidden],Anchor,
|
||||
Lay_PutContextualLinkOnlyIcon (NextAction[HiddenOrVisible],Anchor,
|
||||
FuncPars,Args,
|
||||
Icon[Hidden],Color[Hidden]);
|
||||
Icon[HiddenOrVisible],Color[HiddenOrVisible]);
|
||||
}
|
||||
|
||||
void Ico_PutContextualIconToExpand (const Act_Action_t NextAction,const char *Anchor,
|
||||
|
|
|
@ -80,9 +80,10 @@ void Ico_PutContextualIconToView (Act_Action_t NextAction,const char *Anchor,
|
|||
void (*FuncPars) (void *Args),void *Args);
|
||||
void Ico_PutContextualIconToConfigure (Act_Action_t NextAction,
|
||||
void (*FuncPars) (void *Args),void *Args);
|
||||
void Ico_PutContextualIconToHideUnhide (const Act_Action_t NextAction[2],const char *Anchor,
|
||||
void Ico_PutContextualIconToHideUnhide (const Act_Action_t NextAction[Cns_NUM_HIDDEN_VISIBLE],
|
||||
const char *Anchor,
|
||||
void (*FuncPars) (void *Args),void *Args,
|
||||
bool Hidden);
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible);
|
||||
void Ico_PutContextualIconToExpand (const Act_Action_t NextAction,const char *Anchor,
|
||||
void (*FuncPars) (void *Args),void *Args);
|
||||
void Ico_PutContextualIconToContract (const Act_Action_t NextAction,const char *Anchor,
|
||||
|
|
|
@ -1284,9 +1284,9 @@ static void MchRes_CheckIfICanViewMatchResult (const struct Gam_Game *Game,
|
|||
{
|
||||
case Rol_STD:
|
||||
// Depends on visibility of game and result (eye icons)
|
||||
ICanView->Result = (!Game->Hidden && // The game is visible
|
||||
Match->Status.ShowUsrResults && // The results of the match are visible to users
|
||||
Usr_ItsMe (UsrCod) == Usr_ME); // The result is mine
|
||||
ICanView->Result = (Game->HiddenOrVisible == Cns_VISIBLE && // The game is visible
|
||||
Match->Status.ShowUsrResults && // The results of the match are visible to users
|
||||
Usr_ItsMe (UsrCod) == Usr_ME); // The result is mine
|
||||
// Whether I belong or not to groups of match is not checked here...
|
||||
// ...because I should be able to see old matches made in old groups to which I belonged
|
||||
|
||||
|
|
|
@ -504,10 +504,10 @@ static void Not_DrawANotice (Not_Listing_t TypeNoticesListing,
|
|||
bool Highlight)
|
||||
{
|
||||
extern const char *Txt_See_full_notice;
|
||||
static Act_Action_t ActionHideUnhide[2] =
|
||||
static Act_Action_t ActionHideUnhide[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = ActHidNot, // Visible ==> action to hide
|
||||
[true ] = ActUnhNot, // Hidden ==> action to unhide
|
||||
[Cns_HIDDEN ] = ActUnhNot, // Hidden ==> action to unhide
|
||||
[Cns_VISIBLE] = ActHidNot, // Visible ==> action to hide
|
||||
};
|
||||
static const char *ContainerClass[Not_NUM_STATUS] =
|
||||
{
|
||||
|
|
|
@ -74,7 +74,9 @@ struct Level
|
|||
{
|
||||
unsigned Number; // Numbers for each level from 1 to maximum level
|
||||
bool Expanded; // If each level from 1 to maximum level is expanded
|
||||
bool Hidden; // If each level from 1 to maximum level is hidden
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible; // If each level...
|
||||
// ...from 1 to maximum level...
|
||||
// ...is hidden or visible
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -125,7 +127,7 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
|
|||
long SelectedRscCod);
|
||||
static void Prg_PutIconToContractExpandItem (struct Prg_Item *Item,
|
||||
bool Expanded,bool Editing);
|
||||
static void Prg_WriteItemText (long ItmCod,bool IsHidden);
|
||||
static void Prg_WriteItemText (long ItmCod,Cns_HiddenOrVisible_t HiddenOrVisible);
|
||||
static void Prg_WriteRowToCreateItem (long ParentItmCod,unsigned FormLevel);
|
||||
static void Prg_SetTitleClass (char **TitleClass,unsigned Level);
|
||||
static void Prg_FreeTitleClass (char *TitleClass);
|
||||
|
@ -141,12 +143,12 @@ static void Prg_WriteNumItem (unsigned Level);
|
|||
static void Prg_WriteNumNewItem (unsigned Level);
|
||||
|
||||
static void Prg_SetExpandedLevel (unsigned Level,bool Expanded);
|
||||
static void Prg_SetHiddenLevel (unsigned Level,bool Hidden);
|
||||
static void Prg_SetHiddenLevel (unsigned Level,Cns_HiddenOrVisible_t HiddenOrVisible);
|
||||
static bool Prg_GetExpandedLevel (unsigned Level);
|
||||
static bool Prg_GetHiddenLevel (unsigned Level);
|
||||
static Cns_HiddenOrVisible_t Prg_GetHiddenLevel (unsigned Level);
|
||||
|
||||
static bool Prg_CheckIfAllHigherLevelsAreExpanded (unsigned CurrentLevel);
|
||||
static bool Prg_CheckIfAnyHigherLevelIsHidden (unsigned CurrentLevel);
|
||||
static Cns_HiddenOrVisible_t Prg_CheckIfAnyHigherLevelIsHidden (unsigned CurrentLevel);
|
||||
|
||||
static void Prg_PutFormsToRemEditOneItem (Prg_ListingType_t ListingType,
|
||||
unsigned NumItem,
|
||||
|
@ -485,7 +487,12 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
|
|||
[false] = "", // Not expanded
|
||||
[true ] = " rowspan=\"2\"", // Expanded
|
||||
};
|
||||
bool IsHidden;
|
||||
static const char *PrgClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = " PRG_HIDDEN",
|
||||
[Cns_VISIBLE] = "",
|
||||
};
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible = Cns_HIDDEN; // Initialized to avoid warning
|
||||
char *Id;
|
||||
unsigned ColSpan;
|
||||
unsigned NumCol;
|
||||
|
@ -494,13 +501,18 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
|
|||
bool HighlightItem;
|
||||
|
||||
/***** Check if this item should be shown as hidden *****/
|
||||
Prg_SetHiddenLevel (Item->Hierarchy.Level,Item->Hierarchy.Hidden);
|
||||
if (Item->Hierarchy.Hidden) // this item is marked as hidden
|
||||
IsHidden = true;
|
||||
else // this item is not marked as hidden
|
||||
IsHidden = Prg_CheckIfAnyHigherLevelIsHidden (Item->Hierarchy.Level);
|
||||
Prg_SetHiddenLevel (Item->Hierarchy.Level,Item->Hierarchy.HiddenOrVisible);
|
||||
switch (Item->Hierarchy.HiddenOrVisible)
|
||||
{
|
||||
case Cns_HIDDEN: // this item is marked as hidden
|
||||
HiddenOrVisible = Cns_HIDDEN;
|
||||
break;
|
||||
case Cns_VISIBLE: // this item is not marked as hidden
|
||||
HiddenOrVisible = Prg_CheckIfAnyHigherLevelIsHidden (Item->Hierarchy.Level);
|
||||
break;
|
||||
}
|
||||
|
||||
if (EditingProgram[ListingType] || !IsHidden)
|
||||
if (EditingProgram[ListingType] || HiddenOrVisible == Cns_VISIBLE)
|
||||
{
|
||||
/***** Increase number in level *****/
|
||||
Prg_IncreaseNumberInLevel (Item->Hierarchy.Level);
|
||||
|
@ -545,9 +557,7 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
|
|||
HTM_TD_Begin ("class=\"PRG_NUM %s\"%s",
|
||||
The_GetColorRows (),RowSpan[Expanded]);
|
||||
HTM_DIV_Begin ("class=\"RT %s%s\"",
|
||||
TitleClass,
|
||||
IsHidden ? " PRG_HIDDEN" :
|
||||
"");
|
||||
TitleClass,PrgClass[HiddenOrVisible]);
|
||||
Prg_WriteNumItem (Item->Hierarchy.Level);
|
||||
HTM_DIV_End ();
|
||||
HTM_TD_End ();
|
||||
|
@ -569,9 +579,7 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
|
|||
if (HighlightItem)
|
||||
HTM_ARTICLE_Begin (Prg_ITEM_SECTION_ID);
|
||||
HTM_DIV_Begin ("class=\"LT %s%s\"",
|
||||
TitleClass,
|
||||
IsHidden ? " PRG_HIDDEN" :
|
||||
"");
|
||||
TitleClass,PrgClass[HiddenOrVisible]);
|
||||
HTM_Txt (Item->Title);
|
||||
HTM_DIV_End ();
|
||||
if (HighlightItem)
|
||||
|
@ -599,9 +607,7 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
|
|||
Id,
|
||||
Item->Open ? "DATE_GREEN" :
|
||||
"DATE_RED",
|
||||
The_GetSuffix (),
|
||||
IsHidden ? " PRG_HIDDEN" :
|
||||
"");
|
||||
The_GetSuffix (),PrgClass[HiddenOrVisible]);
|
||||
Dat_WriteLocalDateHMSFromUTC (Id,Item->TimeUTC[StartEndTime],
|
||||
Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA,
|
||||
true,true,false,0x6);
|
||||
|
@ -639,7 +645,7 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
|
|||
Prg_ShowFormToChangeItem (Item->Hierarchy.ItmCod);
|
||||
else
|
||||
/* Text */
|
||||
Prg_WriteItemText (Item->Hierarchy.ItmCod,IsHidden);
|
||||
Prg_WriteItemText (Item->Hierarchy.ItmCod,HiddenOrVisible);
|
||||
|
||||
/* List of resources */
|
||||
PrgRsc_ListItemResources (ListingType,Item,SelectedItmCod,SelectedRscCod);
|
||||
|
@ -682,8 +688,13 @@ static void Prg_PutIconToContractExpandItem (struct Prg_Item *Item,
|
|||
/**************************** Show item text *********************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static void Prg_WriteItemText (long ItmCod,bool IsHidden)
|
||||
static void Prg_WriteItemText (long ItmCod,Cns_HiddenOrVisible_t HiddenOrVisible)
|
||||
{
|
||||
static const char *PrgClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = " PRG_HIDDEN",
|
||||
[Cns_VISIBLE] = "",
|
||||
};
|
||||
char Txt[Cns_MAX_BYTES_TEXT + 1];
|
||||
|
||||
/* Text */
|
||||
|
@ -692,9 +703,7 @@ static void Prg_WriteItemText (long ItmCod,bool IsHidden)
|
|||
Txt,Cns_MAX_BYTES_TEXT,Str_DONT_REMOVE_SPACES);
|
||||
ALn_InsertLinks (Txt,Cns_MAX_BYTES_TEXT,60); // Insert links
|
||||
HTM_DIV_Begin ("class=\"PAR PRG_TXT_%s%s\"",
|
||||
The_GetSuffix (),
|
||||
IsHidden ? " PRG_HIDDEN" :
|
||||
"");
|
||||
The_GetSuffix (),PrgClass[HiddenOrVisible]);
|
||||
HTM_Txt (Txt);
|
||||
HTM_DIV_End ();
|
||||
}
|
||||
|
@ -900,10 +909,10 @@ static void Prg_SetExpandedLevel (unsigned Level,bool Expanded)
|
|||
Prg_Gbl.Levels[Level].Expanded = Expanded;
|
||||
}
|
||||
|
||||
static void Prg_SetHiddenLevel (unsigned Level,bool Hidden)
|
||||
static void Prg_SetHiddenLevel (unsigned Level,Cns_HiddenOrVisible_t HiddenOrVisible)
|
||||
{
|
||||
if (Prg_Gbl.Levels)
|
||||
Prg_Gbl.Levels[Level].Hidden = Hidden;
|
||||
Prg_Gbl.Levels[Level].HiddenOrVisible = HiddenOrVisible;
|
||||
}
|
||||
|
||||
static bool Prg_GetExpandedLevel (unsigned Level)
|
||||
|
@ -918,16 +927,16 @@ static bool Prg_GetExpandedLevel (unsigned Level)
|
|||
return false;
|
||||
}
|
||||
|
||||
static bool Prg_GetHiddenLevel (unsigned Level)
|
||||
static Cns_HiddenOrVisible_t Prg_GetHiddenLevel (unsigned Level)
|
||||
{
|
||||
/* Level 0 (root) is always visible */
|
||||
if (Level == 0)
|
||||
return false;
|
||||
return Cns_VISIBLE;
|
||||
|
||||
if (Prg_Gbl.Levels)
|
||||
return Prg_Gbl.Levels[Level].Hidden;
|
||||
return Prg_Gbl.Levels[Level].HiddenOrVisible;
|
||||
|
||||
return false;
|
||||
return Cns_VISIBLE;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -947,17 +956,17 @@ static bool Prg_CheckIfAllHigherLevelsAreExpanded (unsigned CurrentLevel)
|
|||
return true; // None is contracted. All are expanded
|
||||
}
|
||||
|
||||
static bool Prg_CheckIfAnyHigherLevelIsHidden (unsigned CurrentLevel)
|
||||
static Cns_HiddenOrVisible_t Prg_CheckIfAnyHigherLevelIsHidden (unsigned CurrentLevel)
|
||||
{
|
||||
unsigned Level;
|
||||
|
||||
for (Level = 1;
|
||||
Level < CurrentLevel;
|
||||
Level++)
|
||||
if (Prg_GetHiddenLevel (Level)) // Hidden?
|
||||
return true;
|
||||
if (Prg_GetHiddenLevel (Level) == Cns_HIDDEN)
|
||||
return Cns_HIDDEN;
|
||||
|
||||
return false; // None is hidden. All are visible.
|
||||
return Cns_VISIBLE; // None is hidden. All are visible.
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -970,10 +979,10 @@ static void Prg_PutFormsToRemEditOneItem (Prg_ListingType_t ListingType,
|
|||
bool HighlightItem)
|
||||
{
|
||||
extern const char *Txt_Movement_not_allowed;
|
||||
static Act_Action_t ActionHideUnhide[2] =
|
||||
static Act_Action_t ActionHideUnhide[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = ActHidPrgItm, // Visible ==> action to hide
|
||||
[true ] = ActUnhPrgItm, // Hidden ==> action to unhide
|
||||
[Cns_HIDDEN ] = ActUnhPrgItm, // Hidden ==> action to unhide
|
||||
[Cns_VISIBLE] = ActHidPrgItm, // Visible ==> action to hide
|
||||
};
|
||||
char StrItemIndex[Cns_MAX_DECIMAL_DIGITS_UINT + 1];
|
||||
|
||||
|
@ -991,7 +1000,7 @@ static void Prg_PutFormsToRemEditOneItem (Prg_ListingType_t ListingType,
|
|||
/***** Icon to hide/unhide program item *****/
|
||||
Ico_PutContextualIconToHideUnhide (ActionHideUnhide,Prg_HIGHLIGHTED_SECTION_ID,
|
||||
Prg_PutParItmCod,&Item->Hierarchy.ItmCod,
|
||||
Item->Hierarchy.Hidden);
|
||||
Item->Hierarchy.HiddenOrVisible);
|
||||
|
||||
/***** Icon to edit program item *****/
|
||||
if (ListingType == Prg_FORM_EDIT_ITEM && HighlightItem)
|
||||
|
@ -1182,7 +1191,8 @@ void Prg_GetListItems (void)
|
|||
Prg_Gbl.List.Items[NumItem].Level = Str_ConvertStrToUnsigned (row[2]);
|
||||
|
||||
/* Get whether the program item is hidden or not (row[3]) */
|
||||
Prg_Gbl.List.Items[NumItem].Hidden = (row[3][0] == 'Y');
|
||||
Prg_Gbl.List.Items[NumItem].HiddenOrVisible = (row[3][0] == 'Y') ? Cns_HIDDEN :
|
||||
Cns_VISIBLE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1250,7 +1260,8 @@ static void Prg_GetItemDataFromRow (MYSQL_RES **mysql_res,
|
|||
Item->Hierarchy.Level = Str_ConvertStrToUnsigned (row[2]);
|
||||
|
||||
/* Get whether the program item is hidden or not (row[3]) */
|
||||
Item->Hierarchy.Hidden = (row[3][0] == 'Y');
|
||||
Item->Hierarchy.HiddenOrVisible = (row[3][0] == 'Y') ? Cns_HIDDEN :
|
||||
Cns_VISIBLE;
|
||||
|
||||
/* Get author of the program item (row[4]) */
|
||||
Item->UsrCod = Str_ConvertStrCodToLongCod (row[4]);
|
||||
|
@ -1299,7 +1310,7 @@ void Prg_ResetItem (struct Prg_Item *Item)
|
|||
Item->Hierarchy.ItmCod = -1L;
|
||||
Item->Hierarchy.ItmInd = 0;
|
||||
Item->Hierarchy.Level = 0;
|
||||
Item->Hierarchy.Hidden = false;
|
||||
Item->Hierarchy.HiddenOrVisible = Cns_VISIBLE;
|
||||
Item->UsrCod = -1L;
|
||||
Item->TimeUTC[Dat_STR_TIME] =
|
||||
Item->TimeUTC[Dat_END_TIME] = (time_t) 0;
|
||||
|
@ -1312,7 +1323,7 @@ void Prg_ResetResource (struct Prg_Item *Item)
|
|||
{
|
||||
Item->Resource.Hierarchy.RscCod = -1L;
|
||||
Item->Resource.Hierarchy.RscInd = 0;
|
||||
Item->Resource.Hierarchy.Hidden = false;
|
||||
Item->Resource.Hierarchy.HiddenOrVisible = Cns_VISIBLE;
|
||||
Item->Resource.Link.Type = Rsc_NONE;
|
||||
Item->Resource.Link.Cod = -1L;
|
||||
Item->Resource.Title[0] = '\0';
|
||||
|
|
|
@ -42,7 +42,7 @@ struct Prg_ResourceHierarchy
|
|||
{
|
||||
long RscCod;
|
||||
unsigned RscInd; // 1, 2, 3...
|
||||
bool Hidden;
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible;
|
||||
};
|
||||
|
||||
#define Prg_MAX_CHARS_PROGRAM_ITEM_TITLE (128 - 1) // 127
|
||||
|
@ -53,7 +53,7 @@ struct Prg_ItemHierarchy
|
|||
long ItmCod;
|
||||
unsigned ItmInd; // 1, 2, 3...
|
||||
unsigned Level;
|
||||
bool Hidden;
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible;
|
||||
};
|
||||
|
||||
struct Prg_Item
|
||||
|
|
|
@ -351,7 +351,8 @@ static void PrgRsc_GetResourceDataFromRow (MYSQL_RES *mysql_res,
|
|||
Item->Resource.Hierarchy.RscInd = Str_ConvertStrToUnsigned (row[2]);
|
||||
|
||||
/***** Get whether the program item is hidden (row(3)) *****/
|
||||
Item->Resource.Hierarchy.Hidden = (row[3][0] == 'Y');
|
||||
Item->Resource.Hierarchy.HiddenOrVisible = (row[3][0] == 'Y') ? Cns_HIDDEN :
|
||||
Cns_VISIBLE;
|
||||
|
||||
/***** Get link type and code (row[4], row[5]) *****/
|
||||
Item->Resource.Link.Type = Rsc_GetTypeFromString (row[4]);
|
||||
|
@ -507,10 +508,10 @@ static void PrgRsc_PutFormsToRemEditOneResource (struct Prg_Item *Item,
|
|||
unsigned NumRsc,
|
||||
unsigned NumResources)
|
||||
{
|
||||
static Act_Action_t ActionHideUnhide[2] =
|
||||
static Act_Action_t ActionHideUnhide[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = ActHidPrgRsc, // Visible ==> action to hide
|
||||
[true ] = ActUnhPrgRsc, // Hidden ==> action to unhide
|
||||
[Cns_HIDDEN ] = ActUnhPrgRsc, // Hidden ==> action to unhide
|
||||
[Cns_VISIBLE] = ActHidPrgRsc, // Visible ==> action to hide
|
||||
};
|
||||
extern const char *Txt_Movement_not_allowed;
|
||||
extern const char *Txt_Visible;
|
||||
|
@ -530,7 +531,7 @@ static void PrgRsc_PutFormsToRemEditOneResource (struct Prg_Item *Item,
|
|||
if (NumRsc < NumResources)
|
||||
Ico_PutContextualIconToHideUnhide (ActionHideUnhide,PrgRsc_RESOURCE_SECTION_ID,
|
||||
PrgRsc_PutParRscCod,&Item->Resource.Hierarchy.RscCod,
|
||||
Item->Resource.Hierarchy.Hidden);
|
||||
Item->Resource.Hierarchy.HiddenOrVisible);
|
||||
else
|
||||
Ico_PutIconOff ("eye.svg",Ico_GREEN,Txt_Visible);
|
||||
|
||||
|
|
|
@ -3155,10 +3155,10 @@ static Prj_Order_t Prj_GetParPrjOrder (void)
|
|||
static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects,
|
||||
const char *Anchor)
|
||||
{
|
||||
static Act_Action_t ActionHideUnhide[2] =
|
||||
static Act_Action_t ActionHideUnhide[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = ActHidPrj, // Visible ==> action to hide
|
||||
[true ] = ActUnhPrj, // Hidden ==> action to unhide
|
||||
[Cns_HIDDEN ] = ActUnhPrj, // Hidden ==> action to unhide
|
||||
[Cns_VISIBLE] = ActHidPrj, // Visible ==> action to hide
|
||||
};
|
||||
|
||||
if (Prj_CheckIfICanEditProject (&Projects->Prj))
|
||||
|
|
183
swad_survey.c
183
swad_survey.c
|
@ -402,6 +402,31 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
|
|||
extern const char *Txt_Users;
|
||||
extern const char *Txt_Answer_survey;
|
||||
extern const char *Txt_View_results;
|
||||
static const char *DateGreenClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DATE_GREEN_LIGHT",
|
||||
[Cns_VISIBLE] = "DATE_GREEN",
|
||||
};
|
||||
static const char *DateRedClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DATE_RED_LIGHT",
|
||||
[Cns_VISIBLE] = "DATE_RED",
|
||||
};
|
||||
static const char *TitleClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "ASG_TITLE_LIGHT",
|
||||
[Cns_VISIBLE] = "ASG_TITLE",
|
||||
};
|
||||
static const char *GroupClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "ASG_GRP_LIGHT",
|
||||
[Cns_VISIBLE] = "ASG_GRP",
|
||||
};
|
||||
static const char *DataClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DAT_LIGHT",
|
||||
[Cns_VISIBLE] = "DAT",
|
||||
};
|
||||
char *Anchor = NULL;
|
||||
static unsigned UniqueId = 0;
|
||||
char *Id;
|
||||
|
@ -446,18 +471,14 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
|
|||
if (ShowOnlyThisSvyComplete)
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"",
|
||||
Id,
|
||||
Surveys->Svy.Status.Hidden ? (Surveys->Svy.Status.Open ? "DATE_GREEN_LIGHT" :
|
||||
"DATE_RED_LIGHT") :
|
||||
(Surveys->Svy.Status.Open ? "DATE_GREEN" :
|
||||
"DATE_RED"),
|
||||
Surveys->Svy.Status.Open ? DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] :
|
||||
DateRedClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
else
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
|
||||
Id,
|
||||
Surveys->Svy.Status.Hidden ? (Surveys->Svy.Status.Open ? "DATE_GREEN_LIGHT" :
|
||||
"DATE_RED_LIGHT") :
|
||||
(Surveys->Svy.Status.Open ? "DATE_GREEN" :
|
||||
"DATE_RED"),
|
||||
Surveys->Svy.Status.Open ? DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] :
|
||||
DateRedClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
Dat_WriteLocalDateHMSFromUTC (Id,Surveys->Svy.TimeUTC[Dat_STR_TIME],
|
||||
|
@ -472,18 +493,14 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
|
|||
if (ShowOnlyThisSvyComplete)
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"",
|
||||
Id,
|
||||
Surveys->Svy.Status.Hidden ? (Surveys->Svy.Status.Open ? "DATE_GREEN_LIGHT" :
|
||||
"DATE_RED_LIGHT") :
|
||||
(Surveys->Svy.Status.Open ? "DATE_GREEN" :
|
||||
"DATE_RED"),
|
||||
Surveys->Svy.Status.Open ? DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] :
|
||||
DateRedClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
else
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
|
||||
Id,
|
||||
Surveys->Svy.Status.Hidden ? (Surveys->Svy.Status.Open ? "DATE_GREEN_LIGHT" :
|
||||
"DATE_RED_LIGHT") :
|
||||
(Surveys->Svy.Status.Open ? "DATE_GREEN" :
|
||||
"DATE_RED"),
|
||||
Surveys->Svy.Status.Open ? DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] :
|
||||
DateRedClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
Dat_WriteLocalDateHMSFromUTC (Id,Surveys->Svy.TimeUTC[Dat_END_TIME],
|
||||
|
@ -506,8 +523,7 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
|
|||
Grp_PutParWhichGroups (&WhichGroups);
|
||||
Pag_PutParPagNum (Pag_SURVEYS,Surveys->CurrentPage);
|
||||
HTM_BUTTON_Submit_Begin (Txt_View_survey,"class=\"LT BT_LINK %s_%s\"",
|
||||
Surveys->Svy.Status.Hidden ? "ASG_TITLE_LIGHT" :
|
||||
"ASG_TITLE",
|
||||
TitleClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Surveys->Svy.Title);
|
||||
HTM_BUTTON_End ();
|
||||
|
@ -516,8 +532,7 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
|
|||
|
||||
/* Number of questions and number of distinct users who have already answered this survey */
|
||||
HTM_DIV_Begin ("class=\"%s_%s\"",
|
||||
Surveys->Svy.Status.Hidden ? "ASG_GRP_LIGHT" :
|
||||
"ASG_GRP",
|
||||
GroupClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_TxtColonNBSP (Txt_Number_of_questions);
|
||||
HTM_Unsigned (Surveys->Svy.NumQsts);
|
||||
|
@ -595,8 +610,7 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
|
|||
|
||||
/* Scope of the survey */
|
||||
HTM_DIV_Begin ("class=\"%s_%s\"",
|
||||
Surveys->Svy.Status.Hidden ? "ASG_GRP_LIGHT" :
|
||||
"ASG_GRP",
|
||||
GroupClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_TxtColonNBSP (Txt_Scope);
|
||||
switch (Surveys->Svy.Scope)
|
||||
|
@ -627,8 +641,7 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
|
|||
|
||||
/* Users' roles who can answer the survey */
|
||||
HTM_DIV_Begin ("class=\"%s_%s\"",
|
||||
Surveys->Svy.Status.Hidden ? "ASG_GRP_LIGHT" :
|
||||
"ASG_GRP",
|
||||
GroupClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_TxtColon (Txt_Users);
|
||||
HTM_BR ();
|
||||
|
@ -650,8 +663,7 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
|
|||
Txt,Cns_MAX_BYTES_TEXT,Str_DONT_REMOVE_SPACES);
|
||||
ALn_InsertLinks (Txt,Cns_MAX_BYTES_TEXT,60); // Insert links
|
||||
HTM_DIV_Begin ("class=\"PAR %s_%s\"",
|
||||
Surveys->Svy.Status.Hidden ? "DAT_LIGHT" :
|
||||
"DAT",
|
||||
DataClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt);
|
||||
HTM_DIV_End ();
|
||||
|
@ -715,7 +727,7 @@ static void Svy_PutIconsOneSvy (void *Surveys)
|
|||
|
||||
static void Svy_WriteAuthor (struct Svy_Survey *Svy)
|
||||
{
|
||||
Usr_WriteAuthor1Line (Svy->UsrCod,Svy->Status.Hidden);
|
||||
Usr_WriteAuthor1Line (Svy->UsrCod,Svy->Status.HiddenOrVisible);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -734,37 +746,48 @@ 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_have_already_answered;
|
||||
extern const char *Txt_SURVEY_You_have_not_answered;
|
||||
static const char *Class[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "STATUS_RED_LIGHT",
|
||||
[Cns_VISIBLE] = "STATUS_GREEN",
|
||||
};
|
||||
static const char **TxtHiddenOrVisible[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = &Txt_Hidden_survey,
|
||||
[Cns_VISIBLE] = &Txt_Visible_survey,
|
||||
};
|
||||
static const char *StatusGreenClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DATE_GREEN_LIGHT",
|
||||
[Cns_VISIBLE] = "DATE_GREEN",
|
||||
};
|
||||
static const char *StatusRedClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "DATE_RED_LIGHT",
|
||||
[Cns_VISIBLE] = "DATE_RED",
|
||||
};
|
||||
|
||||
/***** Begin list with items of status *****/
|
||||
HTM_UL_Begin (NULL);
|
||||
|
||||
/* Write whether survey is visible or hidden */
|
||||
if (Svy->Status.Hidden)
|
||||
{
|
||||
HTM_LI_Begin ("class=\"STATUS_RED_LIGHT_%s\"",The_GetSuffix ());
|
||||
HTM_Txt (Txt_Hidden_survey);
|
||||
}
|
||||
else
|
||||
{
|
||||
HTM_LI_Begin ("class=\"STATUS_GREEN_%s\"",The_GetSuffix ());
|
||||
HTM_Txt (Txt_Visible_survey);
|
||||
}
|
||||
HTM_LI_Begin ("class=\"%s_%s\"",
|
||||
Class[Svy->Status.HiddenOrVisible],The_GetSuffix ());
|
||||
HTM_Txt (*TxtHiddenOrVisible[Svy->Status.HiddenOrVisible]);
|
||||
HTM_LI_End ();
|
||||
|
||||
/* Write whether survey is open or closed */
|
||||
if (Svy->Status.Open)
|
||||
{
|
||||
HTM_LI_Begin ("class=\"%s_%s\"",
|
||||
Svy->Status.Hidden ? "STATUS_GREEN_LIGHT" :
|
||||
"STATUS_GREEN",
|
||||
StatusGreenClass[Svy->Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt_Open_survey);
|
||||
}
|
||||
else
|
||||
{
|
||||
HTM_LI_Begin ("class=\"%s_%s\"",
|
||||
Svy->Status.Hidden ? "STATUS_RED_LIGHT" :
|
||||
"STATUS_RED",
|
||||
StatusRedClass[Svy->Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt_Closed_survey);
|
||||
}
|
||||
|
@ -774,16 +797,14 @@ static void Svy_WriteStatus (struct Svy_Survey *Svy)
|
|||
if (Svy->Status.IAmLoggedWithAValidRoleToAnswer)
|
||||
{
|
||||
HTM_LI_Begin ("class=\"%s_%s\"",
|
||||
Svy->Status.Hidden ? "STATUS_GREEN_LIGHT" :
|
||||
"STATUS_GREEN",
|
||||
StatusGreenClass[Svy->Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt_SURVEY_Type_of_user_allowed);
|
||||
}
|
||||
else
|
||||
{
|
||||
HTM_LI_Begin ("class=\"%s_%s\"",
|
||||
Svy->Status.Hidden ? "STATUS_RED_LIGHT" :
|
||||
"STATUS_RED",
|
||||
StatusRedClass[Svy->Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt_SURVEY_Type_of_user_not_allowed);
|
||||
}
|
||||
|
@ -793,16 +814,14 @@ static void Svy_WriteStatus (struct Svy_Survey *Svy)
|
|||
if (Svy->Status.IBelongToScope)
|
||||
{
|
||||
HTM_LI_Begin ("class=\"%s_%s\"",
|
||||
Svy->Status.Hidden ? "STATUS_GREEN_LIGHT" :
|
||||
"STATUS_GREEN",
|
||||
StatusGreenClass[Svy->Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt_SURVEY_You_belong_to_the_scope_of_the_survey);
|
||||
}
|
||||
else
|
||||
{
|
||||
HTM_LI_Begin ("class=\"%s_%s\"",
|
||||
Svy->Status.Hidden ? "STATUS_RED_LIGHT" :
|
||||
"STATUS_RED",
|
||||
StatusRedClass[Svy->Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt_SURVEY_You_dont_belong_to_the_scope_of_the_survey);
|
||||
}
|
||||
|
@ -812,16 +831,14 @@ static void Svy_WriteStatus (struct Svy_Survey *Svy)
|
|||
if (Svy->Status.IHaveAnswered)
|
||||
{
|
||||
HTM_LI_Begin ("class=\"%s_%s\"",
|
||||
Svy->Status.Hidden ? "STATUS_GREEN_LIGHT" :
|
||||
"STATUS_GREEN",
|
||||
StatusGreenClass[Svy->Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt_SURVEY_You_have_already_answered);
|
||||
}
|
||||
else
|
||||
{
|
||||
HTM_LI_Begin ("class=\"%s_%s\"",
|
||||
Svy->Status.Hidden ? "STATUS_RED_LIGHT" :
|
||||
"STATUS_RED",
|
||||
StatusRedClass[Svy->Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt_SURVEY_You_have_not_answered);
|
||||
}
|
||||
|
@ -860,10 +877,10 @@ void Svy_PutParSvyOrder (Dat_StartEndTime_t SelectedOrder)
|
|||
static void Svy_PutFormsToRemEditOneSvy (struct Svy_Surveys *Surveys,
|
||||
const char *Anchor)
|
||||
{
|
||||
static Act_Action_t ActionHideUnhide[2] =
|
||||
static Act_Action_t ActionHideUnhide[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[false] = ActHidSvy, // Visible ==> action to hide
|
||||
[true ] = ActUnhSvy, // Hidden ==> action to unhide
|
||||
[Cns_HIDDEN ] = ActUnhSvy, // Hidden ==> action to unhide
|
||||
[Cns_VISIBLE] = ActHidSvy, // Visible ==> action to hide
|
||||
};
|
||||
|
||||
if (Surveys->Svy.Status.ICanEdit)
|
||||
|
@ -879,7 +896,7 @@ static void Svy_PutFormsToRemEditOneSvy (struct Svy_Surveys *Surveys,
|
|||
/***** Icon to hide/unhide survey *****/
|
||||
Ico_PutContextualIconToHideUnhide (ActionHideUnhide,Anchor,
|
||||
Svy_PutPars,Surveys,
|
||||
Surveys->Svy.Status.Hidden);
|
||||
Surveys->Svy.Status.HiddenOrVisible);
|
||||
|
||||
/***** Icon to edit survey *****/
|
||||
Ico_PutContextualIconToEdit (ActEdiOneSvy,NULL,
|
||||
|
@ -1147,7 +1164,8 @@ void Svy_GetSurveyDataByCod (struct Svy_Survey *Svy)
|
|||
Svy->Cod = Str_ConvertStrCodToLongCod (row[2]);
|
||||
|
||||
/* Get whether the survey is hidden (row[3]) */
|
||||
Svy->Status.Hidden = (row[3][0] == 'Y');
|
||||
Svy->Status.HiddenOrVisible = (row[3][0] == 'Y') ? Cns_HIDDEN :
|
||||
Cns_VISIBLE;
|
||||
|
||||
/* Get roles (row[4]) */
|
||||
if (sscanf (row[4],"%u",&Svy->Roles) != 1)
|
||||
|
@ -1206,7 +1224,7 @@ void Svy_GetSurveyDataByCod (struct Svy_Survey *Svy)
|
|||
|
||||
/* Can I answer survey? */
|
||||
Svy->Status.ICanAnswer = ( Svy->NumQsts != 0) &&
|
||||
!Svy->Status.Hidden &&
|
||||
Svy->Status.HiddenOrVisible == Cns_VISIBLE &&
|
||||
Svy->Status.Open &&
|
||||
Svy->Status.IAmLoggedWithAValidRoleToAnswer &&
|
||||
Svy->Status.IBelongToScope &&
|
||||
|
@ -1217,18 +1235,18 @@ void Svy_GetSurveyDataByCod (struct Svy_Survey *Svy)
|
|||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_STD:
|
||||
Svy->Status.ICanViewResults = ( Svy->Scope == HieLvl_CRS ||
|
||||
Svy->Scope == HieLvl_DEG ||
|
||||
Svy->Scope == HieLvl_CTR ||
|
||||
Svy->Scope == HieLvl_INS ||
|
||||
Svy->Scope == HieLvl_CTY ||
|
||||
Svy->Scope == HieLvl_SYS) &&
|
||||
( Svy->NumQsts != 0) &&
|
||||
!Svy->Status.Hidden &&
|
||||
Svy->Status.Open &&
|
||||
Svy->Status.IAmLoggedWithAValidRoleToAnswer &&
|
||||
Svy->Status.IBelongToScope &&
|
||||
Svy->Status.IHaveAnswered;
|
||||
Svy->Status.ICanViewResults = (Svy->Scope == HieLvl_CRS ||
|
||||
Svy->Scope == HieLvl_DEG ||
|
||||
Svy->Scope == HieLvl_CTR ||
|
||||
Svy->Scope == HieLvl_INS ||
|
||||
Svy->Scope == HieLvl_CTY ||
|
||||
Svy->Scope == HieLvl_SYS) &&
|
||||
(Svy->NumQsts != 0) &&
|
||||
Svy->Status.HiddenOrVisible == Cns_VISIBLE &&
|
||||
Svy->Status.Open &&
|
||||
Svy->Status.IAmLoggedWithAValidRoleToAnswer &&
|
||||
Svy->Status.IBelongToScope &&
|
||||
Svy->Status.IHaveAnswered;
|
||||
Svy->Status.ICanViewComments = false;
|
||||
Svy->Status.ICanEdit = false;
|
||||
break;
|
||||
|
@ -1313,7 +1331,7 @@ void Svy_GetSurveyDataByCod (struct Svy_Survey *Svy)
|
|||
Svy->Title[0] = '\0';
|
||||
Svy->NumQsts = 0;
|
||||
Svy->NumUsrs = 0;
|
||||
Svy->Status.Hidden = false;
|
||||
Svy->Status.HiddenOrVisible = Cns_VISIBLE;
|
||||
Svy->Status.Open = false;
|
||||
Svy->Status.IAmLoggedWithAValidRoleToAnswer = false;
|
||||
Svy->Status.IBelongToScope = false;
|
||||
|
@ -1659,13 +1677,13 @@ void Svy_ReqCreatOrEditSvy (void)
|
|||
Surveys.Svy.Title[0] = '\0';
|
||||
Surveys.Svy.NumQsts = 0;
|
||||
Surveys.Svy.NumUsrs = 0;
|
||||
Surveys.Svy.Status.Hidden = false;
|
||||
Surveys.Svy.Status.Open = true;
|
||||
Surveys.Svy.Status.HiddenOrVisible = Cns_VISIBLE;
|
||||
Surveys.Svy.Status.Open = true;
|
||||
Surveys.Svy.Status.IAmLoggedWithAValidRoleToAnswer = false;
|
||||
Surveys.Svy.Status.IBelongToScope = false;
|
||||
Surveys.Svy.Status.IHaveAnswered = false;
|
||||
Surveys.Svy.Status.ICanAnswer = false;
|
||||
Surveys.Svy.Status.ICanViewResults = false;
|
||||
Surveys.Svy.Status.IBelongToScope = false;
|
||||
Surveys.Svy.Status.IHaveAnswered = false;
|
||||
Surveys.Svy.Status.ICanAnswer = false;
|
||||
Surveys.Svy.Status.ICanViewResults = false;
|
||||
Surveys.Svy.Status.ICanViewComments = false;
|
||||
}
|
||||
else
|
||||
|
@ -2144,6 +2162,11 @@ static void Svy_GetAndWriteNamesOfGrpsAssociatedToSvy (struct Svy_Survey *Svy)
|
|||
extern const char *Txt_Groups;
|
||||
extern const char *Txt_and;
|
||||
extern const char *Txt_The_whole_course;
|
||||
static const char *GroupClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "ASG_GRP_LIGHT",
|
||||
[Cns_VISIBLE] = "ASG_GRP",
|
||||
};
|
||||
MYSQL_RES *mysql_res;
|
||||
MYSQL_ROW row;
|
||||
unsigned NumGrps;
|
||||
|
@ -2154,9 +2177,7 @@ static void Svy_GetAndWriteNamesOfGrpsAssociatedToSvy (struct Svy_Survey *Svy)
|
|||
|
||||
/***** Write heading *****/
|
||||
HTM_DIV_Begin ("class=\"%s_%s\"",
|
||||
Svy->Status.Hidden ? "ASG_GRP_LIGHT" :
|
||||
"ASG_GRP",
|
||||
The_GetSuffix ());
|
||||
GroupClass[Svy->Status.HiddenOrVisible],The_GetSuffix ());
|
||||
HTM_TxtColonNBSP (NumGrps == 1 ? Txt_Group :
|
||||
Txt_Groups);
|
||||
|
||||
|
|
|
@ -53,7 +53,7 @@ struct Svy_Survey
|
|||
unsigned NumUsrs; // Number of distinct users who have already answered the survey
|
||||
struct
|
||||
{
|
||||
bool Hidden; // Survey is hidden
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible; // Survey is hidden or visible?
|
||||
bool Open; // Start date <= now <= end date
|
||||
bool IAmLoggedWithAValidRoleToAnswer; // I am logged with a valid role to answer this survey
|
||||
bool IBelongToScope; // I belong to the scope of this survey
|
||||
|
|
|
@ -39,7 +39,8 @@
|
|||
/******************************* Show visibility *****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void TstVis_ShowVisibilityIcons (unsigned SelectedVisibility,bool Hidden)
|
||||
void TstVis_ShowVisibilityIcons (unsigned SelectedVisibility,
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible)
|
||||
{
|
||||
extern const char *Txt_TST_STR_VISIBILITY[TstVis_NUM_ITEMS_VISIBILITY];
|
||||
extern const char *Txt_TST_HIDDEN_VISIBLE[2];
|
||||
|
@ -51,6 +52,7 @@ void TstVis_ShowVisibilityIcons (unsigned SelectedVisibility,bool Hidden)
|
|||
[TstVis_VISIBLE_EACH_QST_SCORE] = "tasks.svg",
|
||||
[TstVis_VISIBLE_TOTAL_SCORE ] = "check-circle-regular.svg",
|
||||
};
|
||||
static void (*Ico_PutIcon[Cns_NUM_HIDDEN_VISIBLE]) (const char *Icon,Ico_Color_t Color,const char *Title);
|
||||
TstVis_Visibility_t Visibility;
|
||||
bool ItemVisible;
|
||||
char *Title;
|
||||
|
@ -64,12 +66,9 @@ void TstVis_ShowVisibilityIcons (unsigned SelectedVisibility,bool Hidden)
|
|||
Txt_TST_STR_VISIBILITY[Visibility],
|
||||
Txt_TST_HIDDEN_VISIBLE[ItemVisible]) < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
if (Hidden)
|
||||
Ico_PutIconOff (Icons[Visibility],ItemVisible ? Ico_GREEN :
|
||||
Ico_RED ,Title);
|
||||
else
|
||||
Ico_PutIconOn (Icons[Visibility],ItemVisible ? Ico_GREEN :
|
||||
Ico_RED ,Title);
|
||||
|
||||
Ico_PutIcon[HiddenOrVisible] (Icons[Visibility],ItemVisible ? Ico_GREEN :
|
||||
Ico_RED ,Title);
|
||||
free (Title);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,7 +50,8 @@ typedef enum
|
|||
/***************************** Public prototypes *****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void TstVis_ShowVisibilityIcons (unsigned SelectedVisibility,bool Hidden);
|
||||
void TstVis_ShowVisibilityIcons (unsigned SelectedVisibility,
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible);
|
||||
void TstVis_PutVisibilityCheckboxes (unsigned SelectedVisibility);
|
||||
unsigned TstVis_GetVisibilityFromForm (void);
|
||||
unsigned TstVis_GetVisibilityFromStr (const char *Str);
|
||||
|
|
|
@ -57,6 +57,7 @@
|
|||
#include <stddef.h> // For NULL
|
||||
|
||||
#include "swad_action.h"
|
||||
#include "swad_agenda.h"
|
||||
#include "swad_assignment.h"
|
||||
#include "swad_browser.h"
|
||||
#include "swad_building.h"
|
||||
|
@ -1270,7 +1271,7 @@ const char *Txt_Administer_one_user =
|
|||
"Administer one user"; // Çeviri lazim!
|
||||
#endif
|
||||
|
||||
const char *Txt_AGENDA_PAST___FUTURE_EVENTS[2] =
|
||||
const char *Txt_AGENDA_PAST___FUTURE_EVENTS[Agd_NUM_PAST_FUTURE_EVENTS] =
|
||||
{
|
||||
// Agd_PAST___EVENTS
|
||||
#if L==1 // ca
|
||||
|
@ -1368,9 +1369,9 @@ const char *Txt_AGENDA_PRIVAT_PUBLIC_EVENTS[2] =
|
|||
#endif
|
||||
};
|
||||
|
||||
const char *Txt_AGENDA_HIDDEN_VISIBL_EVENTS[2] =
|
||||
const char *Txt_AGENDA_HIDDEN_VISIBLE_EVENTS[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
// Agd_HIDDEN_EVENTS
|
||||
// Cns_HIDDEN
|
||||
#if L==1 // ca
|
||||
"Esdeveniments ocults"
|
||||
#elif L==2 // de
|
||||
|
@ -1393,7 +1394,7 @@ const char *Txt_AGENDA_HIDDEN_VISIBL_EVENTS[2] =
|
|||
"Gizli etkinlikler"
|
||||
#endif
|
||||
,
|
||||
// Agd_VISIBL_EVENTS
|
||||
// Cns_VISIBLE
|
||||
#if L==1 // ca
|
||||
"Esdeveniments visibles"
|
||||
#elif L==2 // de
|
||||
|
|
16
swad_user.c
16
swad_user.c
|
@ -6374,7 +6374,8 @@ void Usr_WriteAuthor (struct Usr_Data *UsrDat,
|
|||
ClassPhoto[Gbl.Prefs.PhotoShape]);
|
||||
HTM_TD_End ();
|
||||
|
||||
/***** Second column with user name (if author has a web page, put a link to it) *****/
|
||||
/***** Second column with user name
|
||||
(if author has a web page, put a link to it) *****/
|
||||
if (WriteAuthor)
|
||||
{
|
||||
HTM_TD_Begin ("class=\"LT\"");
|
||||
|
@ -6384,8 +6385,6 @@ void Usr_WriteAuthor (struct Usr_Data *UsrDat,
|
|||
}
|
||||
else
|
||||
HTM_TD_Begin ("class=\"LM\"");
|
||||
|
||||
/***** End second column *****/
|
||||
HTM_TD_End ();
|
||||
|
||||
/***** End row and table *****/
|
||||
|
@ -6397,7 +6396,7 @@ void Usr_WriteAuthor (struct Usr_Data *UsrDat,
|
|||
/********************* Write the author of an assignment *********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Usr_WriteAuthor1Line (long UsrCod,bool Hidden)
|
||||
void Usr_WriteAuthor1Line (long UsrCod,Cns_HiddenOrVisible_t HiddenOrVisible)
|
||||
{
|
||||
static const char *ClassPhoto[PhoSha_NUM_SHAPES] =
|
||||
{
|
||||
|
@ -6406,6 +6405,11 @@ void Usr_WriteAuthor1Line (long UsrCod,bool Hidden)
|
|||
[PhoSha_SHAPE_OVAL ] = "PHOTOO15x20",
|
||||
[PhoSha_SHAPE_RECTANGLE] = "PHOTOR15x20",
|
||||
};
|
||||
static const char *MsgClass[Cns_NUM_HIDDEN_VISIBLE] =
|
||||
{
|
||||
[Cns_HIDDEN ] = "MSG_AUT_LIGHT",
|
||||
[Cns_VISIBLE] = "MSG_AUT",
|
||||
};
|
||||
bool ShowPhoto = false;
|
||||
char PhotoURL[Cns_MAX_BYTES_WWW + 1];
|
||||
struct Usr_Data UsrDat;
|
||||
|
@ -6427,9 +6431,7 @@ void Usr_WriteAuthor1Line (long UsrCod,bool Hidden)
|
|||
|
||||
/***** Write name *****/
|
||||
HTM_DIV_Begin ("class=\"AUTHOR_1_LINE %s_%s\"",
|
||||
Hidden ? "MSG_AUT_LIGHT" :
|
||||
"MSG_AUT",
|
||||
The_GetSuffix ());
|
||||
MsgClass[HiddenOrVisible],The_GetSuffix ());
|
||||
HTM_Txt (UsrDat.FullName);
|
||||
HTM_DIV_End ();
|
||||
|
||||
|
|
|
@ -435,7 +435,7 @@ unsigned Usr_GetTotalNumberOfUsers (void);
|
|||
|
||||
void Usr_WriteAuthor (struct Usr_Data *UsrDat,
|
||||
Cns_DisabledOrEnabled_t DisabledOrEnabled);
|
||||
void Usr_WriteAuthor1Line (long UsrCod,bool Hidden);
|
||||
void Usr_WriteAuthor1Line (long UsrCod,Cns_HiddenOrVisible_t HiddenOrVisible);
|
||||
|
||||
void Usr_ShowTableCellWithUsrData (struct Usr_Data *UsrDat,unsigned NumRows);
|
||||
|
||||
|
|
53
swad_zip.c
53
swad_zip.c
|
@ -443,7 +443,7 @@ static unsigned long long ZIP_CloneDir (const char *Path,const char *PathClone,c
|
|||
char PathFileInTree[PATH_MAX + 1];
|
||||
struct stat FileStatus;
|
||||
Brw_FileType_t FileType;
|
||||
bool Hidden;
|
||||
Cns_HiddenOrVisible_t HiddenOrVisible;
|
||||
bool SeeDocsZone = Gbl.FileBrowser.Type == Brw_SHOW_DOC_INS ||
|
||||
Gbl.FileBrowser.Type == Brw_SHOW_DOC_CTR ||
|
||||
Gbl.FileBrowser.Type == Brw_SHOW_DOC_DEG ||
|
||||
|
@ -479,35 +479,38 @@ static unsigned long long ZIP_CloneDir (const char *Path,const char *PathClone,c
|
|||
FileType = Str_FileIs (FileList[NumFile]->d_name,"url") ? Brw_IS_LINK : // It's a link (URL inside a .url file)
|
||||
Brw_IS_FILE; // It's a file
|
||||
|
||||
Hidden = (SeeDocsZone || SeeMarks) ? Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (FileType,PathFileInTree) :
|
||||
false;
|
||||
HiddenOrVisible = (SeeDocsZone ||
|
||||
SeeMarks) ? Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (FileType,
|
||||
PathFileInTree) :
|
||||
Cns_VISIBLE;
|
||||
|
||||
if (!Hidden) // If file/folder is not hidden
|
||||
{
|
||||
if (FileType == Brw_IS_FOLDER) // It's a directory
|
||||
{
|
||||
FullSize += (unsigned long long) FileStatus.st_size;
|
||||
if (HiddenOrVisible == Cns_VISIBLE) // If file/folder is visible
|
||||
switch (FileType)
|
||||
{
|
||||
case Brw_IS_FOLDER:
|
||||
FullSize += (unsigned long long) FileStatus.st_size;
|
||||
|
||||
/***** Create clone of subdirectory *****/
|
||||
if (mkdir (PathFileClone,(mode_t) 0xFFF))
|
||||
Err_ShowErrorAndExit ("Can not create temporary subfolder for compression.");
|
||||
/***** Create clone of subdirectory *****/
|
||||
if (mkdir (PathFileClone,(mode_t) 0xFFF))
|
||||
Err_ShowErrorAndExit ("Can not create temporary subfolder for compression.");
|
||||
|
||||
/***** Clone subtree starting at this this directory *****/
|
||||
FullSize += ZIP_CloneDir (PathFile,PathFileClone,PathFileInTree);
|
||||
}
|
||||
else if (FileType == Brw_IS_FILE ||
|
||||
FileType == Brw_IS_LINK) // It's a regular file
|
||||
{
|
||||
FullSize += (unsigned long long) FileStatus.st_size;
|
||||
/***** Clone subtree starting at this this directory *****/
|
||||
FullSize += ZIP_CloneDir (PathFile,PathFileClone,PathFileInTree);
|
||||
break;
|
||||
case Brw_IS_FILE:
|
||||
case Brw_IS_LINK:
|
||||
FullSize += (unsigned long long) FileStatus.st_size;
|
||||
|
||||
/***** Create a symbolic link (clone) to original file *****/
|
||||
if (symlink (PathFile,PathFileClone) != 0)
|
||||
Err_ShowErrorAndExit ("Can not create temporary link for compression.");
|
||||
/***** Create a symbolic link (clone) to original file *****/
|
||||
if (symlink (PathFile,PathFileClone) != 0)
|
||||
Err_ShowErrorAndExit ("Can not create temporary link for compression.");
|
||||
|
||||
/***** Update number of my views of this file *****/
|
||||
Brw_UpdateMyFileViews (Brw_DB_GetFilCodByPath (PathFileInTree,false)); // Any file, public or not
|
||||
}
|
||||
}
|
||||
/***** Update number of my views of this file *****/
|
||||
Brw_UpdateMyFileViews (Brw_DB_GetFilCodByPath (PathFileInTree,false)); // Any file, public or not
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Reference in New Issue