Version 22.23: Sep 23, 2022 New module swad_call_for_exam_resource.

This commit is contained in:
acanas 2022-09-23 21:53:35 +02:00
parent 429136495f
commit f5efd11ecd
15 changed files with 328 additions and 249 deletions

View File

@ -35,13 +35,13 @@ OBJS = swad_account.o swad_account_database.o swad_action.o swad_admin.o \
swad_banner.o swad_banner_database.o swad_box.o swad_browser.o \ swad_banner.o swad_banner_database.o swad_box.o swad_browser.o \
swad_browser_database.o swad_building.o swad_building_database.o \ swad_browser_database.o swad_building.o swad_building_database.o \
swad_button.o \ swad_button.o \
swad_calendar.o swad_call_for_exam.o swad_call_for_exam_database.o \ swad_calendar.o swad_call_for_exam.o swad_call_for_exam_resource.o \
swad_center.o swad_center_config.o swad_center_database.o swad_chat.o \ swad_call_for_exam_database.o swad_center.o swad_center_config.o \
swad_chat_database.o swad_config.o swad_connected.o \ swad_center_database.o swad_chat.o swad_chat_database.o swad_config.o \
swad_connected_database.o swad_cookie.o swad_cookie_database.o \ swad_connected.o swad_connected_database.o swad_cookie.o \
swad_country.o swad_country_config.o swad_country_database.o \ swad_cookie_database.o swad_country.o swad_country_config.o \
swad_course.o swad_course_config.o swad_course_database.o \ swad_country_database.o swad_course.o swad_course_config.o \
swad_cryptography.o \ swad_course_database.o swad_cryptography.o \
swad_database.o swad_date.o swad_degree.o swad_degree_config.o \ swad_database.o swad_date.o swad_degree.o swad_degree_config.o \
swad_degree_database.o swad_degree_type.o swad_department.o \ swad_degree_database.o swad_degree_type.o swad_department.o \
swad_department_database.o swad_duplicate.o swad_duplicate_database.o \ swad_department_database.o swad_duplicate.o swad_duplicate_database.o \

View File

@ -2125,7 +2125,8 @@ a:hover img.CENTER_PHOTO_SHOW
display:inline-block; display:inline-block;
box-sizing:border-box; box-sizing:border-box;
margin:2px 0; margin:2px 0;
padding:8px 12px 12px 12px; padding:10px;
/* padding:8px 12px 12px 12px; */
border-radius:2px; border-radius:2px;
box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14), 0 2px 1px -2px rgba(0,0,0,0.2), 0 1px 5px 0 rgba(0,0,0,0.12); box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14), 0 2px 1px -2px rgba(0,0,0,0.2), 0 1px 5px 0 rgba(0,0,0,0.12);
text-align:center; text-align:center;
@ -3640,7 +3641,13 @@ table.CELLS_PAD_10 > tbody > tr > td {padding:10px;}
.MCH_LIMEGREEN {color:#636e00;} .MCH_LIMEGREEN {color:#636e00;}
.MCH_GREEN {color:#246600;} .MCH_GREEN {color:#246600;}
.MCH_TCH_STEM_WHITE .MCH_TCH_STEM_WHITE,
.MCH_TCH_STEM_GREY,
.MCH_TCH_STEM_PURPLE,
.MCH_TCH_STEM_BLUE,
.MCH_TCH_STEM_YELLOW,
.MCH_TCH_STEM_PINK
.MCH_TCH_STEM_DARK
{ {
color:#202020; color:#202020;
font-size:24pt; font-size:24pt;

View File

@ -29,11 +29,13 @@
#include "swad_admin.h" #include "swad_admin.h"
#include "swad_agenda.h" #include "swad_agenda.h"
#include "swad_announcement.h" #include "swad_announcement.h"
#include "swad_assignment_resource.h"
#include "swad_attendance.h" #include "swad_attendance.h"
#include "swad_banner.h" #include "swad_banner.h"
#include "swad_building.h" #include "swad_building.h"
#include "swad_calendar.h" #include "swad_calendar.h"
#include "swad_call_for_exam.h" #include "swad_call_for_exam.h"
#include "swad_call_for_exam_resource.h"
#include "swad_center_config.h" #include "swad_center_config.h"
#include "swad_config.h" #include "swad_config.h"
#include "swad_cookie.h" #include "swad_cookie.h"
@ -1425,7 +1427,7 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
[ActHidAtt ] = {1069,-1,TabUnk,ActSeeAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Att_HideAttEvent ,NULL}, [ActHidAtt ] = {1069,-1,TabUnk,ActSeeAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Att_HideAttEvent ,NULL},
[ActUnhAtt ] = {1070,-1,TabUnk,ActSeeAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Att_UnhideAttEvent ,NULL}, [ActUnhAtt ] = {1070,-1,TabUnk,ActSeeAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Att_UnhideAttEvent ,NULL},
[ActSeeOneAtt ] = {1071,-1,TabUnk,ActSeeAtt ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Att_SeeOneAttEvent ,NULL}, [ActSeeOneAtt ] = {1071,-1,TabUnk,ActSeeAtt ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Att_SeeOneAttEvent ,NULL},
[ActReqLnkAtt ] = {1938,-1,TabUnk,ActSeeAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Att_GetLinkToEvent ,NULL}, [ActReqLnkAtt ] = {1938,-1,TabUnk,ActSeeAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,AttRsc_GetLinkToEvent ,NULL},
[ActRecAttStd ] = {1072,-1,TabUnk,ActSeeAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Att_RegisterStudentsInAttEvent ,NULL}, [ActRecAttStd ] = {1072,-1,TabUnk,ActSeeAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Att_RegisterStudentsInAttEvent ,NULL},
[ActRecAttMe ] = {1076,-1,TabUnk,ActSeeAtt ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Att_RegisterMeAsStdInAttEvent ,NULL}, [ActRecAttMe ] = {1076,-1,TabUnk,ActSeeAtt ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Att_RegisterMeAsStdInAttEvent ,NULL},

View File

@ -112,10 +112,4 @@ unsigned Asg_GetNumAssignments (HieLvl_Level_t Scope,unsigned *NumNotif);
//-------------------------------- Figures ------------------------------------ //-------------------------------- Figures ------------------------------------
void Asg_GetAndShowAssignmentsStats (void); void Asg_GetAndShowAssignmentsStats (void);
//--------------------------- Program resources -------------------------------
void AsgRsc_GetLinkToAssignment (void);
void AsgRsc_WriteAssignmentInCrsProgram (long AsgCod,bool PutFormToGo,
const char *Icon,const char *IconTitle);
void AsgRsc_GetTitleFromAsgCod (long AsgCod,char *Title,size_t TitleSize);
#endif #endif

View File

@ -34,9 +34,9 @@
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
void Asg_GetLinkToAssignment (void); void AsgRsc_GetLinkToAssignment (void);
void Asg_WriteAssignmentInCrsProgram (long AsgCod,bool PutFormToGo, void AsgRsc_WriteAssignmentInCrsProgram (long AsgCod,bool PutFormToGo,
const char *Icon,const char *IconTitle); const char *Icon,const char *IconTitle);
void Asg_GetTitleFromAsgCod (long AsgCod,char *Title,size_t TitleSize); void AsgRsc_GetTitleFromAsgCod (long AsgCod,char *Title,size_t TitleSize);
#endif #endif

View File

@ -3300,7 +3300,7 @@ static void Att_ListAttEventsForAStd (const struct Att_Events *Events,
/************************ Get link to attendance event ***********************/ /************************ Get link to attendance event ***********************/
/*****************************************************************************/ /*****************************************************************************/
void Att_GetLinkToEvent (void) void AttRsc_GetLinkToEvent (void)
{ {
extern const char *Txt_Link_to_resource_X_copied_into_clipboard; extern const char *Txt_Link_to_resource_X_copied_into_clipboard;
long AttCod; long AttCod;

View File

@ -110,7 +110,7 @@ void Att_ListUsrsAttendanceCrs (void);
void Att_PrintUsrsAttendanceCrs (void); void Att_PrintUsrsAttendanceCrs (void);
//--------------------------- Program resources ------------------------------- //--------------------------- Program resources -------------------------------
void Att_GetLinkToEvent (void); void AttRsc_GetLinkToEvent (void);
void AttRsc_WriteAttEventInCrsProgram (long AttCod,bool PutFormToGo, void AttRsc_WriteAttEventInCrsProgram (long AttCod,bool PutFormToGo,
const char *Icon,const char *IconTitle); const char *Icon,const char *IconTitle);
void AttRsc_GetTitleFromAttCod (long AttCod,char *Title,size_t TitleSize); void AttRsc_GetTitleFromAttCod (long AttCod,char *Title,size_t TitleSize);

View File

@ -155,6 +155,11 @@ static void Box_BoxInternalBegin (const char *Width,const char *Title,
HTM_DIV_Begin ("class=\"%s\"",ClassFrame); HTM_DIV_Begin ("class=\"%s\"",ClassFrame);
/***** Row for left and right icons *****/ /***** Row for left and right icons *****/
if (FunctionToDrawContextualIcons ||
HelpLink ||
Closable == Box_CLOSABLE)
{
/* Begin row for left and right icons */
HTM_DIV_Begin ("class=\"FRAME_ICO\""); HTM_DIV_Begin ("class=\"FRAME_ICO\"");
/* Contextual icons at left */ /* Contextual icons at left */
@ -187,8 +192,9 @@ static void Box_BoxInternalBegin (const char *Width,const char *Title,
HTM_DIV_End (); HTM_DIV_End ();
/***** End row for left and right icons *****/ /* End row for left and right icons */
HTM_DIV_End (); HTM_DIV_End ();
}
/***** Frame title *****/ /***** Frame title *****/
if (Title) if (Title)

View File

@ -1,4 +1,4 @@
// swad_exam_announcement.c: calls for exams // swad_call_for_exam.c: calls for exams
/* /*
SWAD (Shared Workspace At a Distance), SWAD (Shared Workspace At a Distance),
@ -54,12 +54,6 @@
#include "swad_timeline.h" #include "swad_timeline.h"
#include "swad_timeline_database.h" #include "swad_timeline_database.h"
/*****************************************************************************/
/**************************** Private constants ******************************/
/*****************************************************************************/
#define Cfe_MAX_BYTES_SESSION_AND_DATE (Cfe_MAX_BYTES_SESSION + (2 + Cns_MAX_BYTES_DATE + 7) + 1)
/*****************************************************************************/ /*****************************************************************************/
/************** External global variables from others modules ****************/ /************** External global variables from others modules ****************/
/*****************************************************************************/ /*****************************************************************************/
@ -70,13 +64,8 @@ extern struct Globals Gbl;
/***************************** Private prototypes ****************************/ /***************************** Private prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
static struct Cfe_CallsForExams *Cfe_GetGlobalCallsForExams (void);
static long Cfe_GetParamsCallsForExams (struct Cfe_CallsForExams *CallsForExams); static long Cfe_GetParamsCallsForExams (struct Cfe_CallsForExams *CallsForExams);
static void Cfe_AllocMemCallForExam (struct Cfe_CallsForExams *CallsForExams);
static void Cfe_FreeMemCallForExam (struct Cfe_CallsForExams *CallsForExams);
static void Cfe_GetExaCodToHighlight (struct Cfe_CallsForExams *CallsForExams); static void Cfe_GetExaCodToHighlight (struct Cfe_CallsForExams *CallsForExams);
static void Cfe_GetDateToHighlight (struct Cfe_CallsForExams *CallsForExams); static void Cfe_GetDateToHighlight (struct Cfe_CallsForExams *CallsForExams);
@ -85,27 +74,21 @@ static void Cfe_ListCallsForExams (struct Cfe_CallsForExams *CallsForExams,
static void Cfe_PutIconToCreateNewCallForExam (__attribute__((unused)) void *Args); static void Cfe_PutIconToCreateNewCallForExam (__attribute__((unused)) void *Args);
static void Cfe_PutButtonToCreateNewCallForExam (void); static void Cfe_PutButtonToCreateNewCallForExam (void);
static void Cfe_GetDataCallForExamFromDB (struct Cfe_CallsForExams *CallsForExams,
long ExaCod);
static void Cfe_ShowCallForExam (struct Cfe_CallsForExams *CallsForExams, static void Cfe_ShowCallForExam (struct Cfe_CallsForExams *CallsForExams,
long ExaCod, long ExaCod,
Cfe_TypeViewCallForExam_t TypeViewCallForExam, Cfe_TypeViewCallForExam_t TypeViewCallForExam,
bool HighLight); bool HighLight);
static void Cfe_PutIconsCallForExam (void *CallsForExams); static void Cfe_PutIconsCallForExam (void *CallsForExams);
static void Cfe_PutParamExaCodToEdit (void *ExaCod); static void Cfe_PutParamExaCodToEdit (void *ExaCod);
static long Cfe_GetParamExaCod (void);
static void Cfe_GetNotifContentCallForExam (const struct Cfe_CallsForExams *CallsForExams, static void Cfe_GetNotifContentCallForExam (const struct Cfe_CallsForExams *CallsForExams,
char **ContentStr); char **ContentStr);
static void Cfe_BuildSessionAndDate (const struct Cfe_CallsForExams *CallsForExams,
char SessionAndDate[Cfe_MAX_BYTES_SESSION_AND_DATE]);
/*****************************************************************************/ /*****************************************************************************/
/******************** Get global calls for exams context *********************/ /******************** Get global calls for exams context *********************/
/*****************************************************************************/ /*****************************************************************************/
static struct Cfe_CallsForExams *Cfe_GetGlobalCallsForExams (void) struct Cfe_CallsForExams *Cfe_GetGlobalCallsForExams (void)
{ {
static struct Cfe_CallsForExams Cfe_GlobalCallsForExams; // Used to preserve information between priori and posteriori functions static struct Cfe_CallsForExams Cfe_GlobalCallsForExams; // Used to preserve information between priori and posteriori functions
@ -246,7 +229,7 @@ static long Cfe_GetParamsCallsForExams (struct Cfe_CallsForExams *CallsForExams)
/* Allocate memory for those parameters of an exam anno. with a lot of text **/ /* Allocate memory for those parameters of an exam anno. with a lot of text **/
/*****************************************************************************/ /*****************************************************************************/
static void Cfe_AllocMemCallForExam (struct Cfe_CallsForExams *CallsForExams) void Cfe_AllocMemCallForExam (struct Cfe_CallsForExams *CallsForExams)
{ {
if ((CallsForExams->CallForExam.Place = malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) if ((CallsForExams->CallForExam.Place = malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
@ -274,7 +257,7 @@ static void Cfe_AllocMemCallForExam (struct Cfe_CallsForExams *CallsForExams)
/* Free memory of those parameters of an exam announcem. with a lot of text **/ /* Free memory of those parameters of an exam announcem. with a lot of text **/
/*****************************************************************************/ /*****************************************************************************/
static void Cfe_FreeMemCallForExam (struct Cfe_CallsForExams *CallsForExams) void Cfe_FreeMemCallForExam (struct Cfe_CallsForExams *CallsForExams)
{ {
if (CallsForExams->CallForExam.Place) if (CallsForExams->CallForExam.Place)
{ {
@ -794,7 +777,7 @@ void Cfe_FreeListCallsForExams (struct Cfe_CallsForExams *CallsForExams)
/*********** Read the data of a call for exam from the database **************/ /*********** Read the data of a call for exam from the database **************/
/*****************************************************************************/ /*****************************************************************************/
static void Cfe_GetDataCallForExamFromDB (struct Cfe_CallsForExams *CallsForExams, void Cfe_GetDataCallForExamFromDB (struct Cfe_CallsForExams *CallsForExams,
long ExaCod) long ExaCod)
{ {
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
@ -1565,7 +1548,7 @@ void Cfe_PutHiddenParamExaCod (long ExaCod)
/************ Get parameter with the code of a call for exam *****************/ /************ Get parameter with the code of a call for exam *****************/
/*****************************************************************************/ /*****************************************************************************/
static long Cfe_GetParamExaCod (void) long Cfe_GetParamExaCod (void)
{ {
/* Get notice code */ /* Get notice code */
return Par_GetParToLong ("ExaCod"); return Par_GetParToLong ("ExaCod");
@ -1688,133 +1671,11 @@ static void Cfe_GetNotifContentCallForExam (const struct Cfe_CallsForExams *Call
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
} }
/*****************************************************************************/
/************************ Get link to call for exam **************************/
/*****************************************************************************/
void Cfe_GetLinkToCallForExam (void)
{
extern const char *Txt_Link_to_resource_X_copied_into_clipboard;
struct Cfe_CallsForExams *CallsForExams = Cfe_GetGlobalCallsForExams ();
long ExaCod;
char SessionAndDate[Cfe_MAX_BYTES_SESSION_AND_DATE];
/***** Reset calls for exams context *****/
Cfe_ResetCallsForExams (CallsForExams);
/***** Get the code of the call for exam *****/
if ((ExaCod = Cfe_GetParamExaCod ()) <= 0)
Err_WrongCallForExamExit ();
/***** Get data of call for exam *****/
Cfe_AllocMemCallForExam (CallsForExams);
Cfe_GetDataCallForExamFromDB (CallsForExams,ExaCod);
/***** Session and date of the exam *****/
Cfe_BuildSessionAndDate (CallsForExams,SessionAndDate);
/***** Copy link to call for exam into resource clipboard *****/
Prg_DB_CopyToClipboard (PrgRsc_CALL_FOR_EXAM,ExaCod);
/***** Write sucess message *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_Link_to_resource_X_copied_into_clipboard,
SessionAndDate);
/***** Free memory of the call for exam *****/
Cfe_FreeMemCallForExam (CallsForExams);
/***** Set exam to be highlighted *****/
CallsForExams->HighlightExaCod = ExaCod;
/***** Show again the list of calls for exams *****/
Cfe_ListCallsForExamsEdit ();
}
/*****************************************************************************/
/******************* Write call for exam in course program *******************/
/*****************************************************************************/
void CfeRsc_WriteCallForExamInCrsProgram (long ExaCod,bool PutFormToGo,
const char *Icon,const char *IconTitle)
{
extern const char *Txt_Actions[Act_NUM_ACTIONS];
struct Cfe_CallsForExams CallsForExams;
char SessionAndDate[Cfe_MAX_BYTES_SESSION_AND_DATE];
char *Anchor = NULL;
/***** Get session and date of the exam *****/
Cfe_ResetCallsForExams (&CallsForExams);
Cfe_AllocMemCallForExam (&CallsForExams);
Cfe_GetDataCallForExamFromDB (&CallsForExams,ExaCod);
Cfe_BuildSessionAndDate (&CallsForExams,SessionAndDate);
Cfe_FreeMemCallForExam (&CallsForExams);
/***** Begin form to download file *****/
if (PutFormToGo)
{
/* Build anchor string */
Frm_SetAnchorStr (ExaCod,&Anchor);
/* Begin form */
Frm_BeginFormAnchor (ActSeeOneCfe,Anchor);
Cfe_PutHiddenParamExaCod (ExaCod);
HTM_BUTTON_Submit_Begin (Txt_Actions[ActSeeOneCfe],
"class=\"LM BT_LINK PRG_LNK_%s\"",
The_GetSuffix ());
/* Free anchor string */
Frm_FreeAnchorStr (Anchor);
}
/***** Icon depending on type ******/
if (PutFormToGo)
Ico_PutIconLink (Icon,Ico_BLACK,ActSeeOneCfe);
else
Ico_PutIconOn (Icon,Ico_BLACK,IconTitle);
/***** Write Name of the course and date of exam *****/
HTM_Txt (SessionAndDate);
/***** End form to download file *****/
if (PutFormToGo)
{
/* End form */
HTM_BUTTON_End ();
Frm_EndForm ();
}
}
/*****************************************************************************/
/************** Get call for exam text from call for exam code ***************/
/*****************************************************************************/
void CfeRsc_GetTitleFromExaCod (long ExaCod,char *Title,size_t TitleSize)
{
extern const char *Txt_Call_for_exam;
struct Cfe_CallsForExams CallsForExams;
char SessionAndDate[Cfe_MAX_BYTES_SESSION_AND_DATE];
/***** Reset calls for exams context *****/
Cfe_ResetCallsForExams (&CallsForExams);
/***** Get data of call for exam *****/
Cfe_AllocMemCallForExam (&CallsForExams);
Cfe_GetDataCallForExamFromDB (&CallsForExams,ExaCod);
/***** Session and date of the exam *****/
Cfe_BuildSessionAndDate (&CallsForExams,SessionAndDate);
snprintf (Title,TitleSize,"%s: %s",Txt_Call_for_exam,SessionAndDate);
/***** Free memory of the call for exam *****/
Cfe_FreeMemCallForExam (&CallsForExams);
}
/*****************************************************************************/ /*****************************************************************************/
/*********** Build string with session and date of a call for exam ***********/ /*********** Build string with session and date of a call for exam ***********/
/*****************************************************************************/ /*****************************************************************************/
static void Cfe_BuildSessionAndDate (const struct Cfe_CallsForExams *CallsForExams, void Cfe_BuildSessionAndDate (const struct Cfe_CallsForExams *CallsForExams,
char SessionAndDate[Cfe_MAX_BYTES_SESSION_AND_DATE]) char SessionAndDate[Cfe_MAX_BYTES_SESSION_AND_DATE])
{ {
char StrExamDate[Cns_MAX_BYTES_DATE + 1]; char StrExamDate[Cns_MAX_BYTES_DATE + 1];

View File

@ -96,13 +96,19 @@ struct Cfe_CallsForExams
struct Cfe_CallForExam CallForExam; struct Cfe_CallForExam CallForExam;
}; };
#define Cfe_MAX_BYTES_SESSION_AND_DATE (Cfe_MAX_BYTES_SESSION + (2 + Cns_MAX_BYTES_DATE + 7) + 1)
/*****************************************************************************/ /*****************************************************************************/
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
struct Cfe_CallsForExams *Cfe_GetGlobalCallsForExams (void);
void Cfe_ResetCallsForExams (struct Cfe_CallsForExams *CallsForExams); void Cfe_ResetCallsForExams (struct Cfe_CallsForExams *CallsForExams);
void Cfe_PutFrmEditACallForExam (void); void Cfe_PutFrmEditACallForExam (void);
void Cfe_AllocMemCallForExam (struct Cfe_CallsForExams *CallsForExams);
void Cfe_FreeMemCallForExam (struct Cfe_CallsForExams *CallsForExams);
void Cfe_ReceiveCallForExam1 (void); void Cfe_ReceiveCallForExam1 (void);
void Cfe_ReceiveCallForExam2 (void); void Cfe_ReceiveCallForExam2 (void);
void Cfe_PrintCallForExam (void); void Cfe_PrintCallForExam (void);
@ -113,6 +119,8 @@ void Cfe_HideCallForExam (void);
void Cfe_UnhideCallForExam (void); void Cfe_UnhideCallForExam (void);
void Cfe_FreeListCallsForExams (struct Cfe_CallsForExams *CallsForExams); void Cfe_FreeListCallsForExams (struct Cfe_CallsForExams *CallsForExams);
void Cfe_GetDataCallForExamFromDB (struct Cfe_CallsForExams *CallsForExams,
long ExaCod);
void Cfe_ListCallsForExamsSee (void); void Cfe_ListCallsForExamsSee (void);
void Cfe_ListCallsForExamsEdit (void); void Cfe_ListCallsForExamsEdit (void);
@ -121,15 +129,13 @@ void Cfe_ListCallsForExamsDay (void);
void Cfe_CreateListCallsForExams (struct Cfe_CallsForExams *CallsForExams); void Cfe_CreateListCallsForExams (struct Cfe_CallsForExams *CallsForExams);
void Cfe_PutHiddenParamExaCod (long ExaCod); void Cfe_PutHiddenParamExaCod (long ExaCod);
long Cfe_GetParamExaCod (void);
void Cfe_GetSummaryAndContentCallForExam (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], void Cfe_GetSummaryAndContentCallForExam (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
char **ContentStr, char **ContentStr,
long ExaCod,bool GetContent); long ExaCod,bool GetContent);
//--------------------------- Program resources ------------------------------- void Cfe_BuildSessionAndDate (const struct Cfe_CallsForExams *CallsForExams,
void Cfe_GetLinkToCallForExam (void); char SessionAndDate[Cfe_MAX_BYTES_SESSION_AND_DATE]);
void CfeRsc_WriteCallForExamInCrsProgram (long ExaCod,bool PutFormToGo,
const char *Icon,const char *IconTitle);
void CfeRsc_GetTitleFromExaCod (long ExaCod,char *Title,size_t TitleSize);
#endif #endif

View File

@ -0,0 +1,155 @@
// swad_call_for_exam_resource.c: links to calls for exams as program resources
/*
SWAD (Shared Workspace At a Distance),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2022 Antonio Cañas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General 3 License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
#include "swad_alert.h"
#include "swad_call_for_exam.h"
#include "swad_call_for_exam_resource.h"
#include "swad_error.h"
#include "swad_form.h"
#include "swad_program_database.h"
/*****************************************************************************/
/************************ Get link to call for exam **************************/
/*****************************************************************************/
void Cfe_GetLinkToCallForExam (void)
{
extern const char *Txt_Link_to_resource_X_copied_into_clipboard;
struct Cfe_CallsForExams *CallsForExams = Cfe_GetGlobalCallsForExams ();
long ExaCod;
char SessionAndDate[Cfe_MAX_BYTES_SESSION_AND_DATE];
/***** Reset calls for exams context *****/
Cfe_ResetCallsForExams (CallsForExams);
/***** Get the code of the call for exam *****/
if ((ExaCod = Cfe_GetParamExaCod ()) <= 0)
Err_WrongCallForExamExit ();
/***** Get data of call for exam *****/
Cfe_AllocMemCallForExam (CallsForExams);
Cfe_GetDataCallForExamFromDB (CallsForExams,ExaCod);
/***** Session and date of the exam *****/
Cfe_BuildSessionAndDate (CallsForExams,SessionAndDate);
/***** Copy link to call for exam into resource clipboard *****/
Prg_DB_CopyToClipboard (PrgRsc_CALL_FOR_EXAM,ExaCod);
/***** Write sucess message *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_Link_to_resource_X_copied_into_clipboard,
SessionAndDate);
/***** Free memory of the call for exam *****/
Cfe_FreeMemCallForExam (CallsForExams);
/***** Set exam to be highlighted *****/
CallsForExams->HighlightExaCod = ExaCod;
/***** Show again the list of calls for exams *****/
Cfe_ListCallsForExamsEdit ();
}
/*****************************************************************************/
/******************* Write call for exam in course program *******************/
/*****************************************************************************/
void CfeRsc_WriteCallForExamInCrsProgram (long ExaCod,bool PutFormToGo,
const char *Icon,const char *IconTitle)
{
extern const char *Txt_Actions[Act_NUM_ACTIONS];
struct Cfe_CallsForExams CallsForExams;
char SessionAndDate[Cfe_MAX_BYTES_SESSION_AND_DATE];
char *Anchor = NULL;
/***** Get session and date of the exam *****/
Cfe_ResetCallsForExams (&CallsForExams);
Cfe_AllocMemCallForExam (&CallsForExams);
Cfe_GetDataCallForExamFromDB (&CallsForExams,ExaCod);
Cfe_BuildSessionAndDate (&CallsForExams,SessionAndDate);
Cfe_FreeMemCallForExam (&CallsForExams);
/***** Begin form to download file *****/
if (PutFormToGo)
{
/* Build anchor string */
Frm_SetAnchorStr (ExaCod,&Anchor);
/* Begin form */
Frm_BeginFormAnchor (ActSeeOneCfe,Anchor);
Cfe_PutHiddenParamExaCod (ExaCod);
HTM_BUTTON_Submit_Begin (Txt_Actions[ActSeeOneCfe],
"class=\"LM BT_LINK PRG_LNK_%s\"",
The_GetSuffix ());
/* Free anchor string */
Frm_FreeAnchorStr (Anchor);
}
/***** Icon depending on type ******/
if (PutFormToGo)
Ico_PutIconLink (Icon,Ico_BLACK,ActSeeOneCfe);
else
Ico_PutIconOn (Icon,Ico_BLACK,IconTitle);
/***** Write Name of the course and date of exam *****/
HTM_Txt (SessionAndDate);
/***** End form to download file *****/
if (PutFormToGo)
{
/* End form */
HTM_BUTTON_End ();
Frm_EndForm ();
}
}
/*****************************************************************************/
/************** Get call for exam text from call for exam code ***************/
/*****************************************************************************/
void CfeRsc_GetTitleFromExaCod (long ExaCod,char *Title,size_t TitleSize)
{
extern const char *Txt_Call_for_exam;
struct Cfe_CallsForExams CallsForExams;
char SessionAndDate[Cfe_MAX_BYTES_SESSION_AND_DATE];
/***** Reset calls for exams context *****/
Cfe_ResetCallsForExams (&CallsForExams);
/***** Get data of call for exam *****/
Cfe_AllocMemCallForExam (&CallsForExams);
Cfe_GetDataCallForExamFromDB (&CallsForExams,ExaCod);
/***** Session and date of the exam *****/
Cfe_BuildSessionAndDate (&CallsForExams,SessionAndDate);
snprintf (Title,TitleSize,"%s: %s",Txt_Call_for_exam,SessionAndDate);
/***** Free memory of the call for exam *****/
Cfe_FreeMemCallForExam (&CallsForExams);
}

View File

@ -0,0 +1,41 @@
// swad_call_for_exam_resource.h: links to calls for exams as program resources
#ifndef _SWAD_CFE_RSC
#define _SWAD_CFE_RSC
/*
SWAD (Shared Workspace At a Distance),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2022 Antonio Cañas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General 3 License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
#include <stddef.h> // For size_t
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/
void Cfe_GetLinkToCallForExam (void);
void CfeRsc_WriteCallForExamInCrsProgram (long ExaCod,bool PutFormToGo,
const char *Icon,const char *IconTitle);
void CfeRsc_GetTitleFromExaCod (long ExaCod,char *Title,size_t TitleSize);
#endif

View File

@ -606,10 +606,12 @@ TODO: Fix bug: error al enviar un mensaje a dos recipientes, error on duplicate
TODO: Attach pdf files in multimedia. TODO: Attach pdf files in multimedia.
*/ */
#define Log_PLATFORM_VERSION "SWAD 22.22 (2022-09-23)" #define Log_PLATFORM_VERSION "SWAD 22.23 (2022-09-23)"
#define CSS_FILE "swad22.21.css" #define CSS_FILE "swad22.22.1.css"
#define JS_FILE "swad21.100.js" #define JS_FILE "swad21.100.js"
/* /*
Version 22.23: Sep 23, 2022 New module swad_call_for_exam_resource. (331924 lines)
Version 22.22.1: Sep 23, 2022 Changes in layout of course program. (331875 lines)
Version 22.22: Sep 23, 2022 Course program open to teachers and students. (331856 lines) Version 22.22: Sep 23, 2022 Course program open to teachers and students. (331856 lines)
Version 22.21: Sep 22, 2022 Changes in layout of course program. (331855 lines) Version 22.21: Sep 22, 2022 Changes in layout of course program. (331855 lines)
Version 22.20: Sep 22, 2022 Hidden items are not shown in program. (331838 lines) Version 22.20: Sep 22, 2022 Hidden items are not shown in program. (331838 lines)

View File

@ -617,7 +617,7 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
""); "");
Dat_WriteLocalDateHMSFromUTC (Id,Item->TimeUTC[StartEndTime], Dat_WriteLocalDateHMSFromUTC (Id,Item->TimeUTC[StartEndTime],
Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA, Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA,
true,true,true,0x7); true,true,true,0x6);
HTM_DIV_End (); HTM_DIV_End ();
free (Id); free (Id);
} }

View File

@ -33,7 +33,7 @@
#include "swad_assignment_resource.h" #include "swad_assignment_resource.h"
#include "swad_attendance.h" #include "swad_attendance.h"
#include "swad_browser.h" #include "swad_browser.h"
#include "swad_call_for_exam.h" #include "swad_call_for_exam_resource.h"
#include "swad_error.h" #include "swad_error.h"
#include "swad_exam.h" #include "swad_exam.h"
#include "swad_form.h" #include "swad_form.h"
@ -246,19 +246,24 @@ void PrgRsc_ListItemResources (Prg_ListingType_t ListingType,
EditingResourcesOfThisItem = EditingResources[ListingType] && EditingResourcesOfThisItem = EditingResources[ListingType] &&
(Item->Hierarchy.ItmCod == SelectedItmCod); (Item->Hierarchy.ItmCod == SelectedItmCod);
if (Editing[ListingType])
{
if (asprintf (&Title,Txt_Resources_of_X,Item->Title) < 0) if (asprintf (&Title,Txt_Resources_of_X,Item->Title) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
Box_BoxBegin ("100%",Title, Box_BoxBegin ("100%",Title,
Editing[ListingType] ? (EditingResourcesOfThisItem ? PrgRsc_PutIconsViewResources : EditingResourcesOfThisItem ? PrgRsc_PutIconsViewResources :
PrgRsc_PutIconsEditResources) : PrgRsc_PutIconsEditResources,
NULL, &Item->Hierarchy.ItmCod,
Editing[ListingType] ? &Item->Hierarchy.ItmCod :
NULL,
Hlp_COURSE_Program,Box_NOT_CLOSABLE); Hlp_COURSE_Program,Box_NOT_CLOSABLE);
free (Title); free (Title);
}
else
Box_BoxBegin ("100%",NULL,
NULL,NULL,
NULL,Box_NOT_CLOSABLE);
/***** Table *****/ /***** Table *****/
HTM_TABLE_BeginWideMarginPadding (2); HTM_TABLE_BeginWidePadding (2);
HTM_TBODY_Begin (NULL); HTM_TBODY_Begin (NULL);
/***** Write all item resources *****/ /***** Write all item resources *****/