Version19.140

This commit is contained in:
Antonio Cañas Vargas 2020-03-03 00:56:22 +01:00
parent 31bec881b9
commit c9b9f480cc
9 changed files with 333 additions and 179 deletions

View File

@ -1588,7 +1588,7 @@ a:hover img.CENTRE_PHOTO_SHOW
.PRG_COL1 .PRG_COL1
{ {
box-sizing:border-box; box-sizing:border-box;
width:64px; width:86px;
} }
/********************************** Notice ***********************************/ /********************************** Notice ***********************************/

View File

@ -398,10 +398,10 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
[ActChgCrsYeaCfg ] = {1573,-1,TabUnk,ActSeeCrsInf ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,CrsCfg_ChangeCrsYear ,CrsCfg_ContEditAfterChgCrs ,NULL}, [ActChgCrsYeaCfg ] = {1573,-1,TabUnk,ActSeeCrsInf ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,CrsCfg_ChangeCrsYear ,CrsCfg_ContEditAfterChgCrs ,NULL},
[ActEdiCrsInf ] = { 848,-1,TabUnk,ActSeeCrsInf ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Inf_FormsToSelSendInfo ,NULL}, [ActEdiCrsInf ] = { 848,-1,TabUnk,ActSeeCrsInf ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Inf_FormsToSelSendInfo ,NULL},
[ActFrmNewPrgItm ] = {1822,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RequestCreatOrEditPrgItem ,NULL}, [ActFrmNewPrgItm ] = {1822,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RequestCreatePrgItem ,NULL},
[ActEdiOnePrgItm ] = {1823,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RequestCreatOrEditPrgItem ,NULL}, [ActFrmChgPrgItm ] = {1823,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RequestChangePrgItem ,NULL},
[ActNewPrgItm ] = {1825,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RecFormPrgItem ,NULL}, [ActNewPrgItm ] = {1825,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RecFormNewPrgItem ,NULL},
[ActChgPrgItm ] = {1826,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RecFormPrgItem ,NULL}, [ActChgPrgItm ] = {1826,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RecFormChgPrgItem ,NULL},
[ActReqRemPrgItm ] = {1827,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_ReqRemPrgItem ,NULL}, [ActReqRemPrgItm ] = {1827,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_ReqRemPrgItem ,NULL},
[ActRemPrgItm ] = {1828,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RemovePrgItem ,NULL}, [ActRemPrgItm ] = {1828,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RemovePrgItem ,NULL},
[ActHidPrgItm ] = {1829,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_HidePrgItem ,NULL}, [ActHidPrgItm ] = {1829,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_HidePrgItem ,NULL},
@ -3552,7 +3552,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActMtn, // #1820 ActMtn, // #1820
ActSeePrg, // #1821 ActSeePrg, // #1821
ActFrmNewPrgItm, // #1822 ActFrmNewPrgItm, // #1822
ActEdiOnePrgItm, // #1823 ActFrmChgPrgItm, // #1823
-1, // #1824 -1, // #1824
ActNewPrgItm, // #1825 ActNewPrgItm, // #1825
ActChgPrgItm, // #1826 ActChgPrgItm, // #1826

View File

@ -385,7 +385,7 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
#define ActChgCrsYeaCfg (ActChgCrsSta + 14) #define ActChgCrsYeaCfg (ActChgCrsSta + 14)
#define ActEdiCrsInf (ActChgCrsSta + 15) #define ActEdiCrsInf (ActChgCrsSta + 15)
#define ActFrmNewPrgItm (ActChgCrsSta + 16) #define ActFrmNewPrgItm (ActChgCrsSta + 16)
#define ActEdiOnePrgItm (ActChgCrsSta + 17) #define ActFrmChgPrgItm (ActChgCrsSta + 17)
#define ActNewPrgItm (ActChgCrsSta + 18) #define ActNewPrgItm (ActChgCrsSta + 18)
#define ActChgPrgItm (ActChgCrsSta + 19) #define ActChgPrgItm (ActChgCrsSta + 19)
#define ActReqRemPrgItm (ActChgCrsSta + 20) #define ActReqRemPrgItm (ActChgCrsSta + 20)

View File

@ -497,7 +497,7 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD: En OpenSWAD:
ps2pdf source.ps destination.pdf ps2pdf source.ps destination.pdf
*/ */
#define Log_PLATFORM_VERSION "SWAD 19.139 (2020-03-02)" #define Log_PLATFORM_VERSION "SWAD 19.140 (2020-03-03)"
#define CSS_FILE "swad19.136.css" #define CSS_FILE "swad19.136.css"
#define JS_FILE "swad19.91.1.js" #define JS_FILE "swad19.91.1.js"
/* /*
@ -523,6 +523,7 @@ Param
// TODO: Miguel Damas: por defecto, marcar "Permitir que los profesores..." en los test (que ya esté marcado en lugar de desmarcado) // TODO: Miguel Damas: por defecto, marcar "Permitir que los profesores..." en los test (que ya esté marcado en lugar de desmarcado)
// TODO: Si el alumno ha marcado "Permitir que los profesores...", entonces pedir confirmación al pulsar el botón azul, para evitar que se envíe por error antes de tiempo // TODO: Si el alumno ha marcado "Permitir que los profesores...", entonces pedir confirmación al pulsar el botón azul, para evitar que se envíe por error antes de tiempo
Version 19.140: Mar 03, 2020 New action to add a new item inside a item inside another one. (282375 lines)
Version 19.139: Mar 02, 2020 Changes in course program. (282252 lines) Version 19.139: Mar 02, 2020 Changes in course program. (282252 lines)
Version 19.138.1: Feb 29, 2020 Fixed bugs in course program. (282252 lines) Version 19.138.1: Feb 29, 2020 Fixed bugs in course program. (282252 lines)
Version 19.138: Feb 29, 2020 Move subtrees up and down in course program. (282230 lines) Version 19.138: Feb 29, 2020 Move subtrees up and down in course program. (282230 lines)

View File

@ -480,7 +480,7 @@ void Dat_PutFormStartEndClientLocalDateTimesWithYesterdayToday (const Dat_SetHMS
/************* Show forms to enter initial and ending date-times *************/ /************* Show forms to enter initial and ending date-times *************/
/*****************************************************************************/ /*****************************************************************************/
void Dat_PutFormStartEndClientLocalDateTimes (time_t TimeUTC[2], void Dat_PutFormStartEndClientLocalDateTimes (const time_t TimeUTC[Dat_NUM_START_END_TIME],
Dat_FormSeconds FormSeconds, Dat_FormSeconds FormSeconds,
const Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME]) const Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME])
{ {

View File

@ -144,7 +144,7 @@ struct tm *Dat_GetLocalTimeFromClock (const time_t *timep);
void Dat_ConvDateToDateStr (struct Date *Date,char StrDate[Cns_MAX_BYTES_DATE + 1]); void Dat_ConvDateToDateStr (struct Date *Date,char StrDate[Cns_MAX_BYTES_DATE + 1]);
void Dat_PutFormStartEndClientLocalDateTimesWithYesterdayToday (const Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME]); void Dat_PutFormStartEndClientLocalDateTimesWithYesterdayToday (const Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME]);
void Dat_PutFormStartEndClientLocalDateTimes (time_t TimeUTC[2], void Dat_PutFormStartEndClientLocalDateTimes (const time_t TimeUTC[Dat_NUM_START_END_TIME],
Dat_FormSeconds FormSeconds, Dat_FormSeconds FormSeconds,
const Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME]); const Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME]);

View File

@ -98,10 +98,12 @@ static long Prg_GetCurrentItmCod (void);
static void Prg_PutParams (void); static void Prg_PutParams (void);
static void Prg_GetListPrgItems (void); static void Prg_GetListPrgItems (void);
static void Prg_GetDataOfItemByCod (struct ProgramItem *Item);
static void Prg_GetDataOfItem (struct ProgramItem *Item, static void Prg_GetDataOfItem (struct ProgramItem *Item,
MYSQL_RES **mysql_res, MYSQL_RES **mysql_res,
unsigned long NumRows); unsigned long NumRows);
static void Prg_ResetItem (struct ProgramItem *Item); static void Prg_ResetItem (struct ProgramItem *Item);
static void Prg_FreeListItems (void);
static void Prg_GetPrgItemTxtFromDB (long ItmCod,char Txt[Cns_MAX_BYTES_TEXT + 1]); static void Prg_GetPrgItemTxtFromDB (long ItmCod,char Txt[Cns_MAX_BYTES_TEXT + 1]);
static void Prg_PutParamItmCod (long ItmCod); static void Prg_PutParamItmCod (long ItmCod);
static long Prg_GetParamItmCod (void); static long Prg_GetParamItmCod (void);
@ -109,18 +111,24 @@ static long Prg_GetParamItmCod (void);
static unsigned Prg_GetNumItemFromItmCod (unsigned ItmCod); static unsigned Prg_GetNumItemFromItmCod (unsigned ItmCod);
static unsigned Prg_GetMaxItemLevel (void); static unsigned Prg_GetMaxItemLevel (void);
static unsigned Prg_GetMaxItemIndex (void);
static int Prg_GetPrevBrother (int NumItem); static int Prg_GetPrevBrother (int NumItem);
static int Prg_GetNextBrother (int NumItem); static int Prg_GetNextBrother (int NumItem);
static int Prg_GetLastChild (int NumItem); static unsigned Prg_GetLastChild (int NumItem);
static void Prg_ExchangeItems (int NumItemTop,int NumItemBottom); static void Prg_ExchangeItems (int NumItemTop,int NumItemBottom);
static void Prg_MoveItemAndChildrenLeft (unsigned NumItem); static void Prg_MoveItemAndChildrenLeft (unsigned NumItem);
static void Prg_MoveItemAndChildrenRight (unsigned NumItem); static void Prg_MoveItemAndChildrenRight (unsigned NumItem);
static bool Prg_CheckIfSimilarPrgItemExists (const char *Field,const char *Value,long ItmCod); static bool Prg_CheckIfSimilarPrgItemExists (const char *Field,const char *Value,long ItmCod);
static void Prg_ShowFormToCreatePrgItem (void);
static void Prg_ShowFormToChangePrgItem (void);
static void Prg_ShowFormToPrgItem (const struct ProgramItem *Item,
const Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME],
const char *Txt);
static void Prg_ShowLstGrpsToEditPrgItem (long ItmCod); static void Prg_ShowLstGrpsToEditPrgItem (long ItmCod);
static void Prg_CreatePrgItem (struct ProgramItem *Item,const char *Txt); static void Prg_InsertPrgItem (struct ProgramItem *ParentItem,
struct ProgramItem *Item,const char *Txt);
static long Prg_InsertPrgItemIntoDB (struct ProgramItem *Item,const char *Txt);
static void Prg_UpdatePrgItem (struct ProgramItem *Item,const char *Txt); static void Prg_UpdatePrgItem (struct ProgramItem *Item,const char *Txt);
static bool Prg_CheckIfItemIsAssociatedToGrps (long ItmCod); static bool Prg_CheckIfItemIsAssociatedToGrps (long ItmCod);
static void Prg_RemoveAllTheGrpsAssociatedToAnItem (long ItmCod); static void Prg_RemoveAllTheGrpsAssociatedToAnItem (long ItmCod);
@ -462,6 +470,7 @@ static void Prg_WriteNumItem (unsigned Level)
static void Prg_PutFormsToRemEditOnePrgItem (unsigned NumItem,const char *Anchor) static void Prg_PutFormsToRemEditOnePrgItem (unsigned NumItem,const char *Anchor)
{ {
extern const char *Txt_New_item;
extern const char *Txt_Move_up_X; extern const char *Txt_Move_up_X;
extern const char *Txt_Move_down_X; extern const char *Txt_Move_down_X;
extern const char *Txt_Increase_level_of_X; extern const char *Txt_Increase_level_of_X;
@ -490,7 +499,10 @@ static void Prg_PutFormsToRemEditOnePrgItem (unsigned NumItem,const char *Anchor
Ico_PutContextualIconToHide (ActHidPrgItm,Anchor,Prg_PutParams); Ico_PutContextualIconToHide (ActHidPrgItm,Anchor,Prg_PutParams);
/***** Put form to edit program item *****/ /***** Put form to edit program item *****/
Ico_PutContextualIconToEdit (ActEdiOnePrgItm,Prg_PutParams); Ico_PutContextualIconToEdit (ActFrmChgPrgItm,Prg_PutParams);
/***** Put form to add a new child item inside this item *****/
Ico_PutContextualIconToAdd (ActFrmNewPrgItm,Anchor,Prg_PutParams,Txt_New_item);
HTM_BR (); HTM_BR ();
@ -518,8 +530,6 @@ static void Prg_PutFormsToRemEditOnePrgItem (unsigned NumItem,const char *Anchor
else else
Ico_PutIconOff ("arrow-down.svg",Txt_Movement_not_allowed); Ico_PutIconOff ("arrow-down.svg",Txt_Movement_not_allowed);
HTM_BR ();
/***** Icon to move left item (increase level) *****/ /***** Icon to move left item (increase level) *****/
if (Prg_CheckIfMoveLeftIsAllowed (NumItem)) if (Prg_CheckIfMoveLeftIsAllowed (NumItem))
{ {
@ -752,7 +762,7 @@ static void Prg_GetListPrgItems (void)
/****************** Get program item data using its code *********************/ /****************** Get program item data using its code *********************/
/*****************************************************************************/ /*****************************************************************************/
void Prg_GetDataOfItemByCod (struct ProgramItem *Item) static void Prg_GetDataOfItemByCod (struct ProgramItem *Item)
{ {
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
unsigned long NumRows; unsigned long NumRows;
@ -797,7 +807,7 @@ static void Prg_GetDataOfItem (struct ProgramItem *Item,
Prg_ResetItem (Item); Prg_ResetItem (Item);
/***** Get data of program item from database *****/ /***** Get data of program item from database *****/
if (NumRows) // Schedule item found... if (NumRows) // Item found...
{ {
/* Get row */ /* Get row */
row = mysql_fetch_row (*mysql_res); row = mysql_fetch_row (*mysql_res);
@ -857,7 +867,7 @@ static void Prg_ResetItem (struct ProgramItem *Item)
{ {
Item->Hierarchy.ItmCod = -1L; Item->Hierarchy.ItmCod = -1L;
Item->Hierarchy.Index = 0; Item->Hierarchy.Index = 0;
Item->Hierarchy.Level = 1; Item->Hierarchy.Level = 0;
Item->Hidden = false; Item->Hidden = false;
Item->UsrCod = -1L; Item->UsrCod = -1L;
Item->TimeUTC[Dat_START_TIME] = Item->TimeUTC[Dat_START_TIME] =
@ -871,7 +881,7 @@ static void Prg_ResetItem (struct ProgramItem *Item)
/************************ Free list of program items *************************/ /************************ Free list of program items *************************/
/*****************************************************************************/ /*****************************************************************************/
void Prg_FreeListItems (void) static void Prg_FreeListItems (void)
{ {
if (Gbl.Prg.LstIsRead && Gbl.Prg.LstItems) if (Gbl.Prg.LstIsRead && Gbl.Prg.LstItems)
{ {
@ -1209,35 +1219,6 @@ static unsigned Prg_GetMaxItemLevel (void)
return MaxLevel; return MaxLevel;
} }
/*****************************************************************************/
/**************** Get maximum item index in a course program *****************/
/*****************************************************************************/
// Question index can be 1, 2, 3...
// Return 0 if no items
static unsigned Prg_GetMaxItemIndex (void)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned MaxIndex = 0;
/***** Get maximum item index in a course program from database *****/
DB_QuerySELECT (&mysql_res,"can not get last item index",
"SELECT MAX(ItmInd)"
" FROM prg_items"
" WHERE CrsCod=%ld",
Gbl.Hierarchy.Crs.CrsCod);
row = mysql_fetch_row (mysql_res);
if (row[0]) // There are items
if (sscanf (row[0],"%u",&MaxIndex) != 1)
Lay_ShowErrorAndExit ("Error when getting last item index.");
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
return MaxIndex;
}
/*****************************************************************************/ /*****************************************************************************/
/******** Get previous brother item to a given item in current course ********/ /******** Get previous brother item to a given item in current course ********/
/*****************************************************************************/ /*****************************************************************************/
@ -1303,7 +1284,7 @@ static int Prg_GetNextBrother (int NumItem)
/*****************************************************************************/ /*****************************************************************************/
// Return the same index if no children // Return the same index if no children
static int Prg_GetLastChild (int NumItem) static unsigned Prg_GetLastChild (int NumItem)
{ {
unsigned Level; unsigned Level;
int i; int i;
@ -1311,7 +1292,7 @@ static int Prg_GetLastChild (int NumItem)
/***** Trivial check: if item is wrong, there are no children *****/ /***** Trivial check: if item is wrong, there are no children *****/
if (NumItem < 0 || if (NumItem < 0 ||
NumItem >= (int) Gbl.Prg.Num) NumItem >= (int) Gbl.Prg.Num)
return -1; Lay_ShowErrorAndExit ("Wrong number of item.");
/***** Get next brother after item *****/ /***** Get next brother after item *****/
// 0 <= NumItem < Gbl.Prg.Num // 0 <= NumItem < Gbl.Prg.Num
@ -1497,23 +1478,39 @@ static bool Prg_CheckIfSimilarPrgItemExists (const char *Field,const char *Value
Field,Value,ItmCod) != 0); Field,Value,ItmCod) != 0);
} }
/*****************************************************************************/
/******* Put a form to create/edit program item and show current items *******/
/*****************************************************************************/
void Prg_RequestCreatePrgItem (void)
{
/***** Show form to create item *****/
Prg_ShowFormToCreatePrgItem ();
/***** Show current program items, if any *****/
Prg_ShowAllItems ();
}
void Prg_RequestChangePrgItem (void)
{
/***** Show form to change item *****/
Prg_ShowFormToChangePrgItem ();
/***** Show current program items, if any *****/
Prg_ShowAllItems ();
}
/*****************************************************************************/ /*****************************************************************************/
/***************** Put a form to create a new program item *******************/ /***************** Put a form to create a new program item *******************/
/*****************************************************************************/ /*****************************************************************************/
void Prg_RequestCreatOrEditPrgItem (void) static void Prg_ShowFormToCreatePrgItem (void)
{ {
extern const char *Hlp_COURSE_Program_new_item; extern const char *Hlp_COURSE_Program_new_item;
extern const char *Hlp_COURSE_Program_edit_item;
extern const char *Txt_New_item; extern const char *Txt_New_item;
extern const char *Txt_Edit_item;
extern const char *Txt_Title;
extern const char *Txt_Description;
extern const char *Txt_Create_item; extern const char *Txt_Create_item;
extern const char *Txt_Save_changes; struct ProgramItem ParentItem; // Parent item
struct ProgramItem Item; struct ProgramItem Item;
bool ItsANewItem;
char Txt[Cns_MAX_BYTES_TEXT + 1];
static const Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME] = static const Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME] =
{ {
Dat_HMS_TO_000000, Dat_HMS_TO_000000,
@ -1523,53 +1520,99 @@ void Prg_RequestCreatOrEditPrgItem (void)
/***** Get parameters *****/ /***** Get parameters *****/
Grp_GetParamWhichGrps (); Grp_GetParamWhichGrps ();
/***** Get the code of the program item *****/ /***** Get the code of the parent program item *****/
ItsANewItem = ((Item.Hierarchy.ItmCod = Prg_GetParamItmCod ()) == -1L); ParentItem.Hierarchy.ItmCod = Prg_GetParamItmCod ();
Prg_GetDataOfItemByCod (&ParentItem);
/***** Get from the database the data of the program item *****/ /***** Initialize to empty program item *****/
if (ItsANewItem) Prg_ResetItem (&Item);
{ Item.TimeUTC[Dat_START_TIME] = Gbl.StartExecutionTimeUTC;
/* Initialize to empty program item */ Item.TimeUTC[Dat_END_TIME ] = Gbl.StartExecutionTimeUTC + (2 * 60 * 60); // +2 hours
Prg_ResetItem (&Item); Item.Open = true;
Item.TimeUTC[Dat_START_TIME] = Gbl.StartExecutionTimeUTC;
Item.TimeUTC[Dat_END_TIME ] = Gbl.StartExecutionTimeUTC + (2 * 60 * 60); // +2 hours
Item.Open = true;
}
else
{
/* Get data of the program item from database */
Prg_GetDataOfItemByCod (&Item);
/* Get text of the program item from database */
Prg_GetPrgItemTxtFromDB (Item.Hierarchy.ItmCod,Txt);
}
/***** Begin form *****/ /***** Begin form *****/
if (ItsANewItem) Frm_StartForm (ActNewPrgItm);
{ Prg_SetCurrentItmCod (ParentItem.Hierarchy.ItmCod);
Frm_StartForm (ActNewPrgItm);
Prg_SetCurrentItmCod (-1L);
}
else
{
Frm_StartForm (ActChgPrgItm);
Prg_SetCurrentItmCod (Item.Hierarchy.ItmCod);
}
Prg_PutParams (); Prg_PutParams ();
/***** Begin box and table *****/ /***** Begin box and table *****/
if (ItsANewItem) Box_BoxTableBegin (NULL,Txt_New_item,NULL,
Box_BoxTableBegin (NULL,Txt_New_item,NULL, Hlp_COURSE_Program_new_item,Box_NOT_CLOSABLE,2);
Hlp_COURSE_Program_new_item,Box_NOT_CLOSABLE,2);
else
Box_BoxTableBegin (NULL,
Item.Title[0] ? Item.Title :
Txt_Edit_item,
NULL,
Hlp_COURSE_Program_edit_item,Box_NOT_CLOSABLE,2);
/***** Show form *****/
Prg_ShowFormToPrgItem (&Item,SetHMS,NULL);
/***** Schedule item title *****/ /***** End table, send button and end box *****/
Box_BoxTableWithButtonEnd (Btn_CREATE_BUTTON,Txt_Create_item);
/***** End form *****/
Frm_EndForm ();
}
/*****************************************************************************/
/***************** Put a form to create a new program item *******************/
/*****************************************************************************/
static void Prg_ShowFormToChangePrgItem (void)
{
extern const char *Hlp_COURSE_Program_edit_item;
extern const char *Txt_Edit_item;
extern const char *Txt_Save_changes;
struct ProgramItem Item;
char Txt[Cns_MAX_BYTES_TEXT + 1];
static const Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME] =
{
Dat_HMS_DO_NOT_SET,
Dat_HMS_DO_NOT_SET
};
/***** Get parameters *****/
Grp_GetParamWhichGrps ();
/***** Get the code of the program item *****/
Item.Hierarchy.ItmCod = Prg_GetParamItmCod ();
/***** Get from the database the data of the program item *****/
/* Get data of the program item from database */
Prg_GetDataOfItemByCod (&Item);
/* Get text of the program item from database */
Prg_GetPrgItemTxtFromDB (Item.Hierarchy.ItmCod,Txt);
/***** Begin form *****/
Frm_StartForm (ActChgPrgItm);
Prg_SetCurrentItmCod (Item.Hierarchy.ItmCod);
Prg_PutParams ();
/***** Begin box and table *****/
Box_BoxTableBegin (NULL,
Item.Title[0] ? Item.Title :
Txt_Edit_item,
NULL,
Hlp_COURSE_Program_edit_item,Box_NOT_CLOSABLE,2);
/***** Show form *****/
Prg_ShowFormToPrgItem (&Item,SetHMS,Txt);
/***** End table, send button and end box *****/
Box_BoxTableWithButtonEnd (Btn_CONFIRM_BUTTON,Txt_Save_changes);
/***** End form *****/
Frm_EndForm ();
}
/*****************************************************************************/
/***************** Put a form to create a new program item *******************/
/*****************************************************************************/
static void Prg_ShowFormToPrgItem (const struct ProgramItem *Item,
const Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME],
const char *Txt)
{
extern const char *Txt_Title;
extern const char *Txt_Description;
/***** Item title *****/
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
/* Label */ /* Label */
@ -1577,7 +1620,7 @@ void Prg_RequestCreatOrEditPrgItem (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"LM\""); HTM_TD_Begin ("class=\"LM\"");
HTM_INPUT_TEXT ("Title",Prg_MAX_CHARS_PROGRAM_ITEM_TITLE,Item.Title,false, HTM_INPUT_TEXT ("Title",Prg_MAX_CHARS_PROGRAM_ITEM_TITLE,Item->Title,false,
"id=\"Title\" required=\"required\"" "id=\"Title\" required=\"required\""
" class=\"TITLE_DESCRIPTION_WIDTH\""); " class=\"TITLE_DESCRIPTION_WIDTH\"");
HTM_TD_End (); HTM_TD_End ();
@ -1585,7 +1628,7 @@ void Prg_RequestCreatOrEditPrgItem (void)
HTM_TR_End (); HTM_TR_End ();
/***** Program item start and end dates *****/ /***** Program item start and end dates *****/
Dat_PutFormStartEndClientLocalDateTimes (Item.TimeUTC, Dat_PutFormStartEndClientLocalDateTimes (Item->TimeUTC,
Dat_FORM_SECONDS_ON, Dat_FORM_SECONDS_ON,
SetHMS); SetHMS);
@ -1599,27 +1642,16 @@ void Prg_RequestCreatOrEditPrgItem (void)
HTM_TD_Begin ("class=\"LT\""); HTM_TD_Begin ("class=\"LT\"");
HTM_TEXTAREA_Begin ("id=\"Txt\" name=\"Txt\" rows=\"10\"" HTM_TEXTAREA_Begin ("id=\"Txt\" name=\"Txt\" rows=\"10\""
" class=\"TITLE_DESCRIPTION_WIDTH\""); " class=\"TITLE_DESCRIPTION_WIDTH\"");
if (!ItsANewItem) if (Txt)
HTM_Txt (Txt); if (Txt[0])
HTM_Txt (Txt);
HTM_TEXTAREA_End (); HTM_TEXTAREA_End ();
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
/***** Groups *****/ /***** Groups *****/
Prg_ShowLstGrpsToEditPrgItem (Item.Hierarchy.ItmCod); Prg_ShowLstGrpsToEditPrgItem (Item->Hierarchy.ItmCod);
/***** End table, send button and end box *****/
if (ItsANewItem)
Box_BoxTableWithButtonEnd (Btn_CREATE_BUTTON,Txt_Create_item);
else
Box_BoxTableWithButtonEnd (Btn_CONFIRM_BUTTON,Txt_Save_changes);
/***** End form *****/
Frm_EndForm ();
/***** Show current program items, if any *****/
Prg_ShowAllItems ();
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1689,31 +1721,23 @@ static void Prg_ShowLstGrpsToEditPrgItem (long ItmCod)
/***************** Receive form to create a new program item *****************/ /***************** Receive form to create a new program item *****************/
/*****************************************************************************/ /*****************************************************************************/
void Prg_RecFormPrgItem (void) void Prg_RecFormNewPrgItem (void)
{ {
extern const char *Txt_Already_existed_an_item_with_the_title_X; extern const char *Txt_Already_existed_an_item_with_the_title_X;
extern const char *Txt_You_must_specify_the_title_of_the_item; extern const char *Txt_You_must_specify_the_title_of_the_item;
extern const char *Txt_Created_new_item_X; extern const char *Txt_Created_new_item_X;
extern const char *Txt_The_item_has_been_modified; struct ProgramItem ParentItem; // Parent item
struct ProgramItem OldItem; // Current program item data in database struct ProgramItem NewItem; // Item data received from form
struct ProgramItem NewItem; // Schedule item data received from form
bool ItsANewItem;
bool NewItemIsCorrect = true; bool NewItemIsCorrect = true;
char Description[Cns_MAX_BYTES_TEXT + 1]; char Description[Cns_MAX_BYTES_TEXT + 1];
/***** Get the code of the program item *****/ /***** Get the code of the parent program item *****/
NewItem.Hierarchy.ItmCod = Prg_GetParamItmCod (); ParentItem.Hierarchy.ItmCod = Prg_GetParamItmCod ();
ItsANewItem = (NewItem.Hierarchy.ItmCod < 0); Prg_GetDataOfItemByCod (&ParentItem);
if (ItsANewItem) /***** Set new item code *****/
/***** Reset old (current, not existing) program item data *****/ NewItem.Hierarchy.ItmCod = -1L;
Prg_ResetItem (&OldItem); NewItem.Hierarchy.Level = ParentItem.Hierarchy.Level + 1; // Create as child
else
{
/***** Get data of the old (current) program item from database *****/
OldItem.Hierarchy.ItmCod = NewItem.Hierarchy.ItmCod;
Prg_GetDataOfItemByCod (&OldItem);
}
/***** Get start/end date-times *****/ /***** Get start/end date-times *****/
NewItem.TimeUTC[Dat_START_TIME] = Dat_GetTimeUTCFromForm ("StartTimeUTC"); NewItem.TimeUTC[Dat_START_TIME] = Dat_GetTimeUTCFromForm ("StartTimeUTC");
@ -1755,65 +1779,170 @@ void Prg_RecFormPrgItem (void)
/* Get groups for this program items */ /* Get groups for this program items */
Grp_GetParCodsSeveralGrps (); Grp_GetParCodsSeveralGrps ();
if (ItsANewItem) /* Add new program item to database */
{ Prg_InsertPrgItem (&ParentItem,&NewItem,Description);
Prg_CreatePrgItem (&NewItem,Description); // Add new program item to database
/***** Write success message *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_Created_new_item_X,
NewItem.Title);
}
else
{
Prg_UpdatePrgItem (&NewItem,Description);
/***** Write success message *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_The_item_has_been_modified);
}
/* Free memory for list of selected groups */ /* Free memory for list of selected groups */
Grp_FreeListCodSelectedGrps (); Grp_FreeListCodSelectedGrps ();
/***** Show program items again *****/ /* Write success message */
Prg_SeeCourseProgram (); Ale_ShowAlert (Ale_SUCCESS,Txt_Created_new_item_X,
NewItem.Title);
} }
else else
/***** Show form to create item *****/
// TODO: The form should be filled with partial data, now is always empty // TODO: The form should be filled with partial data, now is always empty
Prg_RequestCreatOrEditPrgItem (); Prg_ShowFormToCreatePrgItem ();
/***** Show program items again *****/
Prg_SeeCourseProgram ();
} }
/*****************************************************************************/ /*****************************************************************************/
/************************ Create a new program item **************************/ /************* Receive form to change an existing program item ***************/
/*****************************************************************************/ /*****************************************************************************/
static void Prg_CreatePrgItem (struct ProgramItem *Item,const char *Txt) void Prg_RecFormChgPrgItem (void)
{ {
unsigned MaxIndex; extern const char *Txt_Already_existed_an_item_with_the_title_X;
extern const char *Txt_You_must_specify_the_title_of_the_item;
extern const char *Txt_Created_new_item_X;
extern const char *Txt_The_item_has_been_modified;
struct ProgramItem OldItem; // Current program item data in database
struct ProgramItem NewItem; // Item data received from form
bool NewItemIsCorrect = true;
char Description[Cns_MAX_BYTES_TEXT + 1];
/***** Get the code of the program item *****/
NewItem.Hierarchy.ItmCod = Prg_GetParamItmCod ();
/***** Get data of the old (current) program item from database *****/
OldItem.Hierarchy.ItmCod = NewItem.Hierarchy.ItmCod;
Prg_GetDataOfItemByCod (&OldItem);
/***** Get start/end date-times *****/
NewItem.TimeUTC[Dat_START_TIME] = Dat_GetTimeUTCFromForm ("StartTimeUTC");
NewItem.TimeUTC[Dat_END_TIME ] = Dat_GetTimeUTCFromForm ("EndTimeUTC" );
/***** Get program item title *****/
Par_GetParToText ("Title",NewItem.Title,Prg_MAX_BYTES_PROGRAM_ITEM_TITLE);
/***** Get program item text *****/
Par_GetParToHTML ("Txt",Description,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous)
/***** Adjust dates *****/
if (NewItem.TimeUTC[Dat_START_TIME] == 0)
NewItem.TimeUTC[Dat_START_TIME] = Gbl.StartExecutionTimeUTC;
if (NewItem.TimeUTC[Dat_END_TIME] == 0)
NewItem.TimeUTC[Dat_END_TIME] = NewItem.TimeUTC[Dat_START_TIME] + 2 * 60 * 60; // +2 hours
/***** Check if title is correct *****/
if (NewItem.Title[0]) // If there's a program item title
{
/* If title of program item was in database... */
if (Prg_CheckIfSimilarPrgItemExists ("Title",NewItem.Title,NewItem.Hierarchy.ItmCod))
{
NewItemIsCorrect = false;
Ale_ShowAlert (Ale_WARNING,Txt_Already_existed_an_item_with_the_title_X,
NewItem.Title);
}
}
else // If there is not a program item title
{
NewItemIsCorrect = false;
Ale_ShowAlert (Ale_WARNING,Txt_You_must_specify_the_title_of_the_item);
}
/***** Update existing item *****/
if (NewItemIsCorrect)
{
/* Get groups for this program items */
Grp_GetParCodsSeveralGrps ();
/* Update program item */
Prg_UpdatePrgItem (&NewItem,Description);
/* Free memory for list of selected groups */
Grp_FreeListCodSelectedGrps ();
/* Write success message */
Ale_ShowAlert (Ale_SUCCESS,Txt_The_item_has_been_modified);
}
else
/***** Show form to change item *****/
// TODO: The form should be filled with partial data, now is always empty
Prg_ShowFormToChangePrgItem ();
/***** Show program items again *****/
Prg_SeeCourseProgram ();
}
/*****************************************************************************/
/*********** Insert a new program item as a child of a parent item ***********/
/*****************************************************************************/
static void Prg_InsertPrgItem (struct ProgramItem *ParentItem,
struct ProgramItem *Item,const char *Txt)
{
unsigned NumItemParent;
unsigned NumItemLastChild;
/***** Lock table to create program item *****/ /***** Lock table to create program item *****/
DB_Query ("can not lock tables to create program item", DB_Query ("can not lock tables to create program item",
"LOCK TABLES prg_items WRITE"); "LOCK TABLES prg_items WRITE");
Gbl.DB.LockedTables = true; Gbl.DB.LockedTables = true;
/***** Get maximum item index *****/ /***** Get list of program items *****/
MaxIndex = Prg_GetMaxItemIndex (); Prg_GetListPrgItems ();
if (Gbl.Prg.Num) // There are items
{
if (ParentItem->Hierarchy.ItmCod > 0) // Parent specified
{
/***** Calculate where to insert *****/
NumItemParent = Prg_GetNumItemFromItmCod (ParentItem->Hierarchy.ItmCod);
NumItemLastChild = Prg_GetLastChild (NumItemParent);
if (NumItemLastChild < Gbl.Prg.Num - 1)
{
/***** New program item will be inserted after last child of parent *****/
Item->Hierarchy.Index = Gbl.Prg.LstItems[NumItemLastChild + 1].Index;
/***** Create a new program item *****/ /***** Move down all indexes of after last child of parent *****/
Item->Hierarchy.Index = MaxIndex + 1; DB_QueryUPDATE ("can not move down items",
Item->Hierarchy.ItmCod = "UPDATE prg_items SET ItmInd=ItmInd+1"
DB_QueryINSERTandReturnCode ("can not create new program item", " WHERE CrsCod=%ld"
"INSERT INTO prg_items" " AND ItmInd>=%u"
" (ItmInd,CrsCod,UsrCod,StartTime,EndTime,Title,Txt)" " ORDER BY ItmInd DESC", // Necessary to not create duplicate key (CrsCod,ItmInd)
" VALUES" Gbl.Hierarchy.Crs.CrsCod,
" (%u,%ld,%ld,FROM_UNIXTIME(%ld),FROM_UNIXTIME(%ld)," Item->Hierarchy.Index);
"'%s','%s')", }
Item->Hierarchy.Index, else
Gbl.Hierarchy.Crs.CrsCod, /***** New program item will be inserted at the end *****/
Gbl.Usrs.Me.UsrDat.UsrCod, Item->Hierarchy.Index = Gbl.Prg.LstItems[Gbl.Prg.Num - 1].Index + 1;
Item->TimeUTC[Dat_START_TIME],
Item->TimeUTC[Dat_END_TIME ], /***** Child ==> parent level + 1 *****/
Item->Title, Item->Hierarchy.Level = ParentItem->Hierarchy.Level + 1;
Txt); }
else // No parent specified
{
/***** New program item will be inserted at the end *****/
Item->Hierarchy.Index = Gbl.Prg.LstItems[Gbl.Prg.Num - 1].Index + 1;
/***** First level *****/
Item->Hierarchy.Level = 1;
}
}
else // There are no items
{
/***** New program item will be inserted as the first one *****/
Item->Hierarchy.Index = 1;
/***** First level *****/
Item->Hierarchy.Level = 1;
}
/***** Insert new program item *****/
Item->Hierarchy.ItmCod = Prg_InsertPrgItemIntoDB (Item,Txt);
/***** Unlock table *****/ /***** Unlock table *****/
Gbl.DB.LockedTables = false; // Set to false before the following unlock... Gbl.DB.LockedTables = false; // Set to false before the following unlock...
@ -1821,11 +1950,36 @@ static void Prg_CreatePrgItem (struct ProgramItem *Item,const char *Txt)
DB_Query ("can not unlock tables after moving items", DB_Query ("can not unlock tables after moving items",
"UNLOCK TABLES"); "UNLOCK TABLES");
/***** Free list items *****/
Prg_FreeListItems ();
/***** Create groups *****/ /***** Create groups *****/
if (Gbl.Crs.Grps.LstGrpsSel.NumGrps) if (Gbl.Crs.Grps.LstGrpsSel.NumGrps)
Prg_CreateGrps (Item->Hierarchy.ItmCod); Prg_CreateGrps (Item->Hierarchy.ItmCod);
} }
/*****************************************************************************/
/***************** Create a new program item into database *******************/
/*****************************************************************************/
static long Prg_InsertPrgItemIntoDB (struct ProgramItem *Item,const char *Txt)
{
return DB_QueryINSERTandReturnCode ("can not create new program item",
"INSERT INTO prg_items"
" (CrsCod,ItmInd,Level,UsrCod,StartTime,EndTime,Title,Txt)"
" VALUES"
" (%ld,%u,%u,%ld,FROM_UNIXTIME(%ld),FROM_UNIXTIME(%ld),"
"'%s','%s')",
Gbl.Hierarchy.Crs.CrsCod,
Item->Hierarchy.Index,
Item->Hierarchy.Level,
Gbl.Usrs.Me.UsrDat.UsrCod,
Item->TimeUTC[Dat_START_TIME],
Item->TimeUTC[Dat_END_TIME ],
Item->Title,
Txt);
}
/*****************************************************************************/ /*****************************************************************************/
/******************** Update an existing program item ************************/ /******************** Update an existing program item ************************/
/*****************************************************************************/ /*****************************************************************************/
@ -2049,10 +2203,10 @@ static bool Prg_CheckIfIBelongToCrsOrGrpsThisItem (long ItmCod)
" WHERE ItmCod=%ld" " WHERE ItmCod=%ld"
" AND " " AND "
"(" "("
// Schedule item is for the whole course // Item is for the whole course
"ItmCod NOT IN (SELECT ItmCod FROM prg_grp)" "ItmCod NOT IN (SELECT ItmCod FROM prg_grp)"
" OR " " OR "
// Schedule item is for specific groups // Item is for specific groups
"ItmCod IN" "ItmCod IN"
" (SELECT prg_grp.ItmCod FROM prg_grp,crs_grp_usr" " (SELECT prg_grp.ItmCod FROM prg_grp,crs_grp_usr"
" WHERE crs_grp_usr.UsrCod=%ld" " WHERE crs_grp_usr.UsrCod=%ld"

View File

@ -69,11 +69,10 @@ struct ProgramItem
void Prg_SeeCourseProgram (void); void Prg_SeeCourseProgram (void);
void Prg_RequestCreatOrEditPrgItem (void); void Prg_RequestCreatePrgItem (void);
void Prg_GetDataOfItemByCod (struct ProgramItem *PrgItem); void Prg_RequestChangePrgItem (void);
void Prg_FreeListItems (void); void Prg_RecFormNewPrgItem (void);
void Prg_RecFormChgPrgItem (void);
long Prg_GetParamItemCode (void);
void Prg_ReqRemPrgItem (void); void Prg_ReqRemPrgItem (void);
void Prg_RemovePrgItem (void); void Prg_RemovePrgItem (void);

View File

@ -4808,7 +4808,7 @@ const char *Txt_Actions[Act_NUM_ACTIONS] =
"" // Precisa de tradução "" // Precisa de tradução
#endif #endif
, ,
[ActEdiOnePrgItm] = [ActFrmChgPrgItm] =
#if L==1 // ca #if L==1 // ca
"" // Necessita traducció "" // Necessita traducció
#elif L==2 // de #elif L==2 // de