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_browser_database.o swad_building.o swad_building_database.o \
swad_button.o \
swad_calendar.o swad_call_for_exam.o swad_call_for_exam_database.o \
swad_center.o swad_center_config.o swad_center_database.o swad_chat.o \
swad_chat_database.o swad_config.o swad_connected.o \
swad_connected_database.o swad_cookie.o swad_cookie_database.o \
swad_country.o swad_country_config.o swad_country_database.o \
swad_course.o swad_course_config.o swad_course_database.o \
swad_cryptography.o \
swad_calendar.o swad_call_for_exam.o swad_call_for_exam_resource.o \
swad_call_for_exam_database.o swad_center.o swad_center_config.o \
swad_center_database.o swad_chat.o swad_chat_database.o swad_config.o \
swad_connected.o swad_connected_database.o swad_cookie.o \
swad_cookie_database.o swad_country.o swad_country_config.o \
swad_country_database.o swad_course.o swad_course_config.o \
swad_course_database.o swad_cryptography.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_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;
box-sizing:border-box;
margin:2px 0;
padding:8px 12px 12px 12px;
padding:10px;
/* padding:8px 12px 12px 12px; */
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);
text-align:center;
@ -3640,7 +3641,13 @@ table.CELLS_PAD_10 > tbody > tr > td {padding:10px;}
.MCH_LIMEGREEN {color:#636e00;}
.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;
font-size:24pt;

View File

@ -29,11 +29,13 @@
#include "swad_admin.h"
#include "swad_agenda.h"
#include "swad_announcement.h"
#include "swad_assignment_resource.h"
#include "swad_attendance.h"
#include "swad_banner.h"
#include "swad_building.h"
#include "swad_calendar.h"
#include "swad_call_for_exam.h"
#include "swad_call_for_exam_resource.h"
#include "swad_center_config.h"
#include "swad_config.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},
[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},
[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},
[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 ------------------------------------
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

View File

@ -34,9 +34,9 @@
/***************************** Public prototypes *****************************/
/*****************************************************************************/
void Asg_GetLinkToAssignment (void);
void Asg_WriteAssignmentInCrsProgram (long AsgCod,bool PutFormToGo,
const char *Icon,const char *IconTitle);
void Asg_GetTitleFromAsgCod (long AsgCod,char *Title,size_t TitleSize);
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

View File

@ -3300,7 +3300,7 @@ static void Att_ListAttEventsForAStd (const struct Att_Events *Events,
/************************ Get link to attendance event ***********************/
/*****************************************************************************/
void Att_GetLinkToEvent (void)
void AttRsc_GetLinkToEvent (void)
{
extern const char *Txt_Link_to_resource_X_copied_into_clipboard;
long AttCod;
@ -3329,7 +3329,7 @@ void Att_GetLinkToEvent (void)
/*****************************************************************************/
void AttRsc_WriteAttEventInCrsProgram (long AttCod,bool PutFormToGo,
const char *Icon,const char *IconTitle)
const char *Icon,const char *IconTitle)
{
extern const char *Txt_Actions[Act_NUM_ACTIONS];
char Title[Att_MAX_BYTES_ATTENDANCE_EVENT_TITLE + 1];

View File

@ -110,9 +110,9 @@ void Att_ListUsrsAttendanceCrs (void);
void Att_PrintUsrsAttendanceCrs (void);
//--------------------------- Program resources -------------------------------
void Att_GetLinkToEvent (void);
void AttRsc_GetLinkToEvent (void);
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);
#endif

View File

@ -155,40 +155,46 @@ static void Box_BoxInternalBegin (const char *Width,const char *Title,
HTM_DIV_Begin ("class=\"%s\"",ClassFrame);
/***** Row for left and right icons *****/
HTM_DIV_Begin ("class=\"FRAME_ICO\"");
if (FunctionToDrawContextualIcons ||
HelpLink ||
Closable == Box_CLOSABLE)
{
/* Begin row for left and right icons */
HTM_DIV_Begin ("class=\"FRAME_ICO\"");
/* Contextual icons at left */
if (FunctionToDrawContextualIcons)
{
HTM_DIV_Begin ("class=\"FRAME_ICO_LEFT\"");
FunctionToDrawContextualIcons (Args);
HTM_DIV_End ();
}
/* Icons at right: help and close */
HTM_DIV_Begin ("class=\"FRAME_ICO_RIGHT\"");
if (HelpLink) // Link to help
{
HTM_A_Begin ("href=\"%s%s\" target=\"_blank\"",Hlp_WIKI,HelpLink);
Ico_PutDivIcon ("CONTEXT_OPT HLP_HIGHLIGHT",
"question.svg",Ico_BLACK,Txt_Help);
HTM_A_End ();
}
if (Closable == Box_CLOSABLE) // Icon to close the box
{
HTM_A_Begin ("href=\"\" onclick=\"toggleDisplay('%s');return false;\"",
Gbl.Box.Ids[Gbl.Box.Nested]);
Ico_PutDivIcon ("CONTEXT_OPT HLP_HIGHLIGHT",
"times.svg",Ico_BLACK,Txt_Close);
HTM_A_End ();
}
/* Contextual icons at left */
if (FunctionToDrawContextualIcons)
{
HTM_DIV_Begin ("class=\"FRAME_ICO_LEFT\"");
FunctionToDrawContextualIcons (Args);
HTM_DIV_End ();
}
/* Icons at right: help and close */
HTM_DIV_Begin ("class=\"FRAME_ICO_RIGHT\"");
if (HelpLink) // Link to help
{
HTM_A_Begin ("href=\"%s%s\" target=\"_blank\"",Hlp_WIKI,HelpLink);
Ico_PutDivIcon ("CONTEXT_OPT HLP_HIGHLIGHT",
"question.svg",Ico_BLACK,Txt_Help);
HTM_A_End ();
}
if (Closable == Box_CLOSABLE) // Icon to close the box
{
HTM_A_Begin ("href=\"\" onclick=\"toggleDisplay('%s');return false;\"",
Gbl.Box.Ids[Gbl.Box.Nested]);
Ico_PutDivIcon ("CONTEXT_OPT HLP_HIGHLIGHT",
"times.svg",Ico_BLACK,Txt_Close);
HTM_A_End ();
}
/* End row for left and right icons */
HTM_DIV_End ();
/***** End row for left and right icons *****/
HTM_DIV_End ();
}
/***** Frame 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),
@ -54,12 +54,6 @@
#include "swad_timeline.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 ****************/
/*****************************************************************************/
@ -70,13 +64,8 @@ extern struct Globals Gbl;
/***************************** Private prototypes ****************************/
/*****************************************************************************/
static struct Cfe_CallsForExams *Cfe_GetGlobalCallsForExams (void);
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_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_PutButtonToCreateNewCallForExam (void);
static void Cfe_GetDataCallForExamFromDB (struct Cfe_CallsForExams *CallsForExams,
long ExaCod);
static void Cfe_ShowCallForExam (struct Cfe_CallsForExams *CallsForExams,
long ExaCod,
Cfe_TypeViewCallForExam_t TypeViewCallForExam,
bool HighLight);
static void Cfe_PutIconsCallForExam (void *CallsForExams);
static void Cfe_PutParamExaCodToEdit (void *ExaCod);
static long Cfe_GetParamExaCod (void);
static void Cfe_GetNotifContentCallForExam (const struct Cfe_CallsForExams *CallsForExams,
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 *********************/
/*****************************************************************************/
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
@ -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 **/
/*****************************************************************************/
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)
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 **/
/*****************************************************************************/
static void Cfe_FreeMemCallForExam (struct Cfe_CallsForExams *CallsForExams)
void Cfe_FreeMemCallForExam (struct Cfe_CallsForExams *CallsForExams)
{
if (CallsForExams->CallForExam.Place)
{
@ -794,8 +777,8 @@ void Cfe_FreeListCallsForExams (struct Cfe_CallsForExams *CallsForExams)
/*********** Read the data of a call for exam from the database **************/
/*****************************************************************************/
static void Cfe_GetDataCallForExamFromDB (struct Cfe_CallsForExams *CallsForExams,
long ExaCod)
void Cfe_GetDataCallForExamFromDB (struct Cfe_CallsForExams *CallsForExams,
long ExaCod)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
@ -1565,7 +1548,7 @@ void Cfe_PutHiddenParamExaCod (long ExaCod)
/************ Get parameter with the code of a call for exam *****************/
/*****************************************************************************/
static long Cfe_GetParamExaCod (void)
long Cfe_GetParamExaCod (void)
{
/* Get notice code */
return Par_GetParToLong ("ExaCod");
@ -1688,133 +1671,11 @@ static void Cfe_GetNotifContentCallForExam (const struct Cfe_CallsForExams *Call
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 ***********/
/*****************************************************************************/
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 StrExamDate[Cns_MAX_BYTES_DATE + 1];

View File

@ -96,13 +96,19 @@ struct Cfe_CallsForExams
struct Cfe_CallForExam CallForExam;
};
#define Cfe_MAX_BYTES_SESSION_AND_DATE (Cfe_MAX_BYTES_SESSION + (2 + Cns_MAX_BYTES_DATE + 7) + 1)
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/
struct Cfe_CallsForExams *Cfe_GetGlobalCallsForExams (void);
void Cfe_ResetCallsForExams (struct Cfe_CallsForExams *CallsForExams);
void Cfe_PutFrmEditACallForExam (void);
void Cfe_AllocMemCallForExam (struct Cfe_CallsForExams *CallsForExams);
void Cfe_FreeMemCallForExam (struct Cfe_CallsForExams *CallsForExams);
void Cfe_ReceiveCallForExam1 (void);
void Cfe_ReceiveCallForExam2 (void);
void Cfe_PrintCallForExam (void);
@ -113,6 +119,8 @@ void Cfe_HideCallForExam (void);
void Cfe_UnhideCallForExam (void);
void Cfe_FreeListCallsForExams (struct Cfe_CallsForExams *CallsForExams);
void Cfe_GetDataCallForExamFromDB (struct Cfe_CallsForExams *CallsForExams,
long ExaCod);
void Cfe_ListCallsForExamsSee (void);
void Cfe_ListCallsForExamsEdit (void);
@ -121,15 +129,13 @@ void Cfe_ListCallsForExamsDay (void);
void Cfe_CreateListCallsForExams (struct Cfe_CallsForExams *CallsForExams);
void Cfe_PutHiddenParamExaCod (long ExaCod);
long Cfe_GetParamExaCod (void);
void Cfe_GetSummaryAndContentCallForExam (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
char **ContentStr,
long ExaCod,bool GetContent);
//--------------------------- Program resources -------------------------------
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);
void Cfe_BuildSessionAndDate (const struct Cfe_CallsForExams *CallsForExams,
char SessionAndDate[Cfe_MAX_BYTES_SESSION_AND_DATE]);
#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.
*/
#define Log_PLATFORM_VERSION "SWAD 22.22 (2022-09-23)"
#define CSS_FILE "swad22.21.css"
#define Log_PLATFORM_VERSION "SWAD 22.23 (2022-09-23)"
#define CSS_FILE "swad22.22.1.css"
#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.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)

View File

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

View File

@ -33,7 +33,7 @@
#include "swad_assignment_resource.h"
#include "swad_attendance.h"
#include "swad_browser.h"
#include "swad_call_for_exam.h"
#include "swad_call_for_exam_resource.h"
#include "swad_error.h"
#include "swad_exam.h"
#include "swad_form.h"
@ -246,50 +246,55 @@ void PrgRsc_ListItemResources (Prg_ListingType_t ListingType,
EditingResourcesOfThisItem = EditingResources[ListingType] &&
(Item->Hierarchy.ItmCod == SelectedItmCod);
if (asprintf (&Title,Txt_Resources_of_X,Item->Title) < 0)
Err_NotEnoughMemoryExit ();
Box_BoxBegin ("100%",Title,
Editing[ListingType] ? (EditingResourcesOfThisItem ? PrgRsc_PutIconsViewResources :
PrgRsc_PutIconsEditResources) :
NULL,
Editing[ListingType] ? &Item->Hierarchy.ItmCod :
NULL,
Hlp_COURSE_Program,Box_NOT_CLOSABLE);
free (Title);
if (Editing[ListingType])
{
if (asprintf (&Title,Txt_Resources_of_X,Item->Title) < 0)
Err_NotEnoughMemoryExit ();
Box_BoxBegin ("100%",Title,
EditingResourcesOfThisItem ? PrgRsc_PutIconsViewResources :
PrgRsc_PutIconsEditResources,
&Item->Hierarchy.ItmCod,
Hlp_COURSE_Program,Box_NOT_CLOSABLE);
free (Title);
}
else
Box_BoxBegin ("100%",NULL,
NULL,NULL,
NULL,Box_NOT_CLOSABLE);
/***** Table *****/
HTM_TABLE_BeginWideMarginPadding (2);
HTM_TBODY_Begin (NULL);
/***** Table *****/
HTM_TABLE_BeginWidePadding (2);
HTM_TBODY_Begin (NULL);
/***** Write all item resources *****/
for (NumRsc = 0, The_ResetRowColor1 (1);
NumRsc < NumResources;
NumRsc++, The_ChangeRowColor1 (1))
{
/* Get data of this item resource */
PrgRsc_GetDataOfResource (Item,&mysql_res);
/***** Write all item resources *****/
for (NumRsc = 0, The_ResetRowColor1 (1);
NumRsc < NumResources;
NumRsc++, The_ChangeRowColor1 (1))
{
/* Get data of this item resource */
PrgRsc_GetDataOfResource (Item,&mysql_res);
/* Show item */
if (EditingResourcesOfThisItem)
PrgRsc_WriteRowEditResource (NumRsc,NumResources,Item,
(ListingType == Prg_EDIT_RESOURCE_LINK &&
Item->Resource.Hierarchy.RscCod == SelectedRscCod)); // Edit this link?
else
PrgRsc_WriteRowViewResource (NumRsc,Item);
}
/* Show item */
if (EditingResourcesOfThisItem)
PrgRsc_WriteRowEditResource (NumRsc,NumResources,Item,
(ListingType == Prg_EDIT_RESOURCE_LINK &&
Item->Resource.Hierarchy.RscCod == SelectedRscCod)); // Edit this link?
else
PrgRsc_WriteRowViewResource (NumRsc,Item);
}
/***** Form to create a new resource *****/
if (EditingResourcesOfThisItem)
{
Prg_ResetResource (Item);
PrgRsc_WriteRowNewResource (NumResources,Item,
(ListingType == Prg_EDIT_RESOURCE_LINK &&
Item->Resource.Hierarchy.RscCod == SelectedRscCod)); // Edit this link?
}
/***** Form to create a new resource *****/
if (EditingResourcesOfThisItem)
{
Prg_ResetResource (Item);
PrgRsc_WriteRowNewResource (NumResources,Item,
(ListingType == Prg_EDIT_RESOURCE_LINK &&
Item->Resource.Hierarchy.RscCod == SelectedRscCod)); // Edit this link?
}
/***** End table *****/
HTM_TBODY_End ();
HTM_TABLE_End ();
/***** End table *****/
HTM_TBODY_End ();
HTM_TABLE_End ();
/***** End box *****/
Box_BoxEnd ();