diff --git a/sql/swad.sql b/sql/swad.sql index c0c62b51..4f6e76bd 100644 --- a/sql/swad.sql +++ b/sql/swad.sql @@ -472,6 +472,7 @@ CREATE TABLE IF NOT EXISTS exa_groups ( CREATE TABLE IF NOT EXISTS exa_events ( EvtCod INT NOT NULL AUTO_INCREMENT, ExaCod INT NOT NULL, + Hidden ENUM('N','Y') NOT NULL DEFAULT 'N', UsrCod INT NOT NULL, StartTime DATETIME NOT NULL, EndTime DATETIME NOT NULL, diff --git a/swad_action.c b/swad_action.c index a5acf5e8..ea78946a 100644 --- a/swad_action.c +++ b/swad_action.c @@ -679,6 +679,8 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = [ActReqRemExaEvt ] = {1850,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaEvt_RequestRemoveEvent ,NULL}, [ActRemExaEvt ] = {1851,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaEvt_RemoveEvent ,NULL}, + [ActHidExaEvt ] = {1900,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaEvt_HideEvent ,NULL}, + [ActShoExaEvt ] = {1901,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaEvt_UnhideEvent ,NULL}, [ActReqNewExaEvt ] = {1852,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaEvt_RequestNewEvent ,NULL}, [ActNewExaEvt ] = {1853,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaEvt_CreateNewEventTch ,NULL}, [ActResExaEvt ] = {1854,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,ExaEvt_GetEventBeingPlayed ,ExaEvt_ResumeEvent ,NULL}, @@ -3710,6 +3712,8 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un ActChgTitExaSet, // #1897 ActNewExaSet, // #1898 ActChgNumQstExaSet, // #1899 + ActHidExaEvt, // #1900 + ActShoExaEvt, // #1901 }; /*****************************************************************************/ diff --git a/swad_action.h b/swad_action.h index 5577d4e3..10bca54e 100644 --- a/swad_action.h +++ b/swad_action.h @@ -64,7 +64,7 @@ typedef enum typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action -#define Act_MAX_ACTION_COD 1899 +#define Act_MAX_ACTION_COD 1901 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13 @@ -646,133 +646,135 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to #define ActSeeExa (ActChgCrsTT1stDay + 123) #define ActReqRemExaEvt (ActChgCrsTT1stDay + 124) #define ActRemExaEvt (ActChgCrsTT1stDay + 125) -#define ActReqNewExaEvt (ActChgCrsTT1stDay + 126) -#define ActNewExaEvt (ActChgCrsTT1stDay + 127) -#define ActResExaEvt (ActChgCrsTT1stDay + 128) -#define ActBckExaEvt (ActChgCrsTT1stDay + 129) -#define ActPlyPauExaEvt (ActChgCrsTT1stDay + 130) -#define ActFwdExaEvt (ActChgCrsTT1stDay + 131) -#define ActChgNumColExaEvt (ActChgCrsTT1stDay + 132) -#define ActChgVisResExaEvtQst (ActChgCrsTT1stDay + 133) -#define ActExaEvtCntDwn (ActChgCrsTT1stDay + 134) -#define ActRefExaEvtTch (ActChgCrsTT1stDay + 135) -#define ActJoiExaEvt (ActChgCrsTT1stDay + 136) -#define ActSeeExaEvtAnsQstStd (ActChgCrsTT1stDay + 137) -#define ActRemExaEvtAnsQstStd (ActChgCrsTT1stDay + 138) -#define ActAnsExaEvtQstStd (ActChgCrsTT1stDay + 139) -#define ActRefExaEvtStd (ActChgCrsTT1stDay + 140) +#define ActHidExaEvt (ActChgCrsTT1stDay + 126) +#define ActShoExaEvt (ActChgCrsTT1stDay + 127) +#define ActReqNewExaEvt (ActChgCrsTT1stDay + 128) +#define ActNewExaEvt (ActChgCrsTT1stDay + 129) +#define ActResExaEvt (ActChgCrsTT1stDay + 130) +#define ActBckExaEvt (ActChgCrsTT1stDay + 131) +#define ActPlyPauExaEvt (ActChgCrsTT1stDay + 132) +#define ActFwdExaEvt (ActChgCrsTT1stDay + 133) +#define ActChgNumColExaEvt (ActChgCrsTT1stDay + 134) +#define ActChgVisResExaEvtQst (ActChgCrsTT1stDay + 135) +#define ActExaEvtCntDwn (ActChgCrsTT1stDay + 136) +#define ActRefExaEvtTch (ActChgCrsTT1stDay + 137) +#define ActJoiExaEvt (ActChgCrsTT1stDay + 138) +#define ActSeeExaEvtAnsQstStd (ActChgCrsTT1stDay + 139) +#define ActRemExaEvtAnsQstStd (ActChgCrsTT1stDay + 140) +#define ActAnsExaEvtQstStd (ActChgCrsTT1stDay + 141) +#define ActRefExaEvtStd (ActChgCrsTT1stDay + 142) -#define ActSeeMyExaEvtResCrs (ActChgCrsTT1stDay + 141) -#define ActSeeMyExaEvtResExa (ActChgCrsTT1stDay + 142) -#define ActSeeMyExaEvtResEvt (ActChgCrsTT1stDay + 143) -#define ActSeeOneExaEvtResMe (ActChgCrsTT1stDay + 144) +#define ActSeeMyExaEvtResCrs (ActChgCrsTT1stDay + 143) +#define ActSeeMyExaEvtResExa (ActChgCrsTT1stDay + 144) +#define ActSeeMyExaEvtResEvt (ActChgCrsTT1stDay + 145) +#define ActSeeOneExaEvtResMe (ActChgCrsTT1stDay + 146) -#define ActReqSeeAllExaEvtRes (ActChgCrsTT1stDay + 145) -#define ActSeeAllExaEvtResCrs (ActChgCrsTT1stDay + 146) -#define ActSeeAllExaEvtResExa (ActChgCrsTT1stDay + 147) -#define ActSeeAllExaEvtResEvt (ActChgCrsTT1stDay + 148) -#define ActSeeOneExaEvtResOth (ActChgCrsTT1stDay + 149) +#define ActReqSeeAllExaEvtRes (ActChgCrsTT1stDay + 147) +#define ActSeeAllExaEvtResCrs (ActChgCrsTT1stDay + 148) +#define ActSeeAllExaEvtResExa (ActChgCrsTT1stDay + 149) +#define ActSeeAllExaEvtResEvt (ActChgCrsTT1stDay + 150) +#define ActSeeOneExaEvtResOth (ActChgCrsTT1stDay + 151) -#define ActChgVisResExaEvtUsr (ActChgCrsTT1stDay + 150) +#define ActChgVisResExaEvtUsr (ActChgCrsTT1stDay + 152) -#define ActFrmNewExa (ActChgCrsTT1stDay + 151) -#define ActEdiOneExa (ActChgCrsTT1stDay + 152) -#define ActNewExa (ActChgCrsTT1stDay + 153) -#define ActChgExa (ActChgCrsTT1stDay + 154) -#define ActReqRemExa (ActChgCrsTT1stDay + 155) -#define ActRemExa (ActChgCrsTT1stDay + 156) -#define ActHidExa (ActChgCrsTT1stDay + 157) -#define ActShoExa (ActChgCrsTT1stDay + 158) -#define ActFrmNewExaSet (ActChgCrsTT1stDay + 159) -#define ActNewExaSet (ActChgCrsTT1stDay + 160) -#define ActReqRemExaSet (ActChgCrsTT1stDay + 161) -#define ActRemExaSet (ActChgCrsTT1stDay + 162) -#define ActUp_ExaSet (ActChgCrsTT1stDay + 163) -#define ActDwnExaSet (ActChgCrsTT1stDay + 164) -#define ActChgTitExaSet (ActChgCrsTT1stDay + 165) -#define ActChgNumQstExaSet (ActChgCrsTT1stDay + 166) +#define ActFrmNewExa (ActChgCrsTT1stDay + 153) +#define ActEdiOneExa (ActChgCrsTT1stDay + 154) +#define ActNewExa (ActChgCrsTT1stDay + 155) +#define ActChgExa (ActChgCrsTT1stDay + 156) +#define ActReqRemExa (ActChgCrsTT1stDay + 157) +#define ActRemExa (ActChgCrsTT1stDay + 158) +#define ActHidExa (ActChgCrsTT1stDay + 159) +#define ActShoExa (ActChgCrsTT1stDay + 160) +#define ActFrmNewExaSet (ActChgCrsTT1stDay + 161) +#define ActNewExaSet (ActChgCrsTT1stDay + 162) +#define ActReqRemExaSet (ActChgCrsTT1stDay + 163) +#define ActRemExaSet (ActChgCrsTT1stDay + 164) +#define ActUp_ExaSet (ActChgCrsTT1stDay + 165) +#define ActDwnExaSet (ActChgCrsTT1stDay + 166) +#define ActChgTitExaSet (ActChgCrsTT1stDay + 167) +#define ActChgNumQstExaSet (ActChgCrsTT1stDay + 168) -#define ActReqAddQstExaSet (ActChgCrsTT1stDay + 167) -#define ActLstTstQstForSet (ActChgCrsTT1stDay + 168) -#define ActAddQstToExa (ActChgCrsTT1stDay + 169) -#define ActReqRemSetQst (ActChgCrsTT1stDay + 170) -#define ActRemExaQst (ActChgCrsTT1stDay + 171) +#define ActReqAddQstExaSet (ActChgCrsTT1stDay + 169) +#define ActLstTstQstForSet (ActChgCrsTT1stDay + 170) +#define ActAddQstToExa (ActChgCrsTT1stDay + 171) +#define ActReqRemSetQst (ActChgCrsTT1stDay + 172) +#define ActRemExaQst (ActChgCrsTT1stDay + 173) -#define ActSeeGam (ActChgCrsTT1stDay + 172) -#define ActReqRemMch (ActChgCrsTT1stDay + 173) -#define ActRemMch (ActChgCrsTT1stDay + 174) -#define ActReqNewMch (ActChgCrsTT1stDay + 175) -#define ActNewMch (ActChgCrsTT1stDay + 176) -#define ActResMch (ActChgCrsTT1stDay + 177) -#define ActBckMch (ActChgCrsTT1stDay + 178) -#define ActPlyPauMch (ActChgCrsTT1stDay + 179) -#define ActFwdMch (ActChgCrsTT1stDay + 180) -#define ActChgNumColMch (ActChgCrsTT1stDay + 181) -#define ActChgVisResMchQst (ActChgCrsTT1stDay + 182) -#define ActMchCntDwn (ActChgCrsTT1stDay + 183) -#define ActRefMchTch (ActChgCrsTT1stDay + 184) +#define ActSeeGam (ActChgCrsTT1stDay + 174) +#define ActReqRemMch (ActChgCrsTT1stDay + 175) +#define ActRemMch (ActChgCrsTT1stDay + 176) +#define ActReqNewMch (ActChgCrsTT1stDay + 177) +#define ActNewMch (ActChgCrsTT1stDay + 178) +#define ActResMch (ActChgCrsTT1stDay + 179) +#define ActBckMch (ActChgCrsTT1stDay + 180) +#define ActPlyPauMch (ActChgCrsTT1stDay + 181) +#define ActFwdMch (ActChgCrsTT1stDay + 182) +#define ActChgNumColMch (ActChgCrsTT1stDay + 183) +#define ActChgVisResMchQst (ActChgCrsTT1stDay + 184) +#define ActMchCntDwn (ActChgCrsTT1stDay + 185) +#define ActRefMchTch (ActChgCrsTT1stDay + 186) -#define ActJoiMch (ActChgCrsTT1stDay + 185) -#define ActSeeMchAnsQstStd (ActChgCrsTT1stDay + 186) -#define ActRemMchAnsQstStd (ActChgCrsTT1stDay + 187) -#define ActAnsMchQstStd (ActChgCrsTT1stDay + 188) -#define ActRefMchStd (ActChgCrsTT1stDay + 189) +#define ActJoiMch (ActChgCrsTT1stDay + 187) +#define ActSeeMchAnsQstStd (ActChgCrsTT1stDay + 188) +#define ActRemMchAnsQstStd (ActChgCrsTT1stDay + 189) +#define ActAnsMchQstStd (ActChgCrsTT1stDay + 190) +#define ActRefMchStd (ActChgCrsTT1stDay + 191) -#define ActSeeMyMchResCrs (ActChgCrsTT1stDay + 190) -#define ActSeeMyMchResGam (ActChgCrsTT1stDay + 191) -#define ActSeeMyMchResMch (ActChgCrsTT1stDay + 192) -#define ActSeeOneMchResMe (ActChgCrsTT1stDay + 193) +#define ActSeeMyMchResCrs (ActChgCrsTT1stDay + 192) +#define ActSeeMyMchResGam (ActChgCrsTT1stDay + 193) +#define ActSeeMyMchResMch (ActChgCrsTT1stDay + 194) +#define ActSeeOneMchResMe (ActChgCrsTT1stDay + 195) -#define ActReqSeeAllMchRes (ActChgCrsTT1stDay + 194) -#define ActSeeAllMchResCrs (ActChgCrsTT1stDay + 195) -#define ActSeeAllMchResGam (ActChgCrsTT1stDay + 196) -#define ActSeeAllMchResMch (ActChgCrsTT1stDay + 197) -#define ActSeeOneMchResOth (ActChgCrsTT1stDay + 198) +#define ActReqSeeAllMchRes (ActChgCrsTT1stDay + 196) +#define ActSeeAllMchResCrs (ActChgCrsTT1stDay + 197) +#define ActSeeAllMchResGam (ActChgCrsTT1stDay + 198) +#define ActSeeAllMchResMch (ActChgCrsTT1stDay + 199) +#define ActSeeOneMchResOth (ActChgCrsTT1stDay + 200) -#define ActChgVisResMchUsr (ActChgCrsTT1stDay + 199) +#define ActChgVisResMchUsr (ActChgCrsTT1stDay + 201) -#define ActFrmNewGam (ActChgCrsTT1stDay + 200) -#define ActEdiOneGam (ActChgCrsTT1stDay + 201) -#define ActNewGam (ActChgCrsTT1stDay + 202) -#define ActChgGam (ActChgCrsTT1stDay + 203) -#define ActReqRemGam (ActChgCrsTT1stDay + 204) -#define ActRemGam (ActChgCrsTT1stDay + 205) -#define ActHidGam (ActChgCrsTT1stDay + 206) -#define ActShoGam (ActChgCrsTT1stDay + 207) -#define ActAddOneGamQst (ActChgCrsTT1stDay + 208) -#define ActGamLstTstQst (ActChgCrsTT1stDay + 209) -#define ActAddTstQstToGam (ActChgCrsTT1stDay + 210) -#define ActReqRemGamQst (ActChgCrsTT1stDay + 211) -#define ActRemGamQst (ActChgCrsTT1stDay + 212) -#define ActUp_GamQst (ActChgCrsTT1stDay + 213) -#define ActDwnGamQst (ActChgCrsTT1stDay + 214) +#define ActFrmNewGam (ActChgCrsTT1stDay + 202) +#define ActEdiOneGam (ActChgCrsTT1stDay + 203) +#define ActNewGam (ActChgCrsTT1stDay + 204) +#define ActChgGam (ActChgCrsTT1stDay + 205) +#define ActReqRemGam (ActChgCrsTT1stDay + 206) +#define ActRemGam (ActChgCrsTT1stDay + 207) +#define ActHidGam (ActChgCrsTT1stDay + 208) +#define ActShoGam (ActChgCrsTT1stDay + 209) +#define ActAddOneGamQst (ActChgCrsTT1stDay + 210) +#define ActGamLstTstQst (ActChgCrsTT1stDay + 211) +#define ActAddTstQstToGam (ActChgCrsTT1stDay + 212) +#define ActReqRemGamQst (ActChgCrsTT1stDay + 213) +#define ActRemGamQst (ActChgCrsTT1stDay + 214) +#define ActUp_GamQst (ActChgCrsTT1stDay + 215) +#define ActDwnGamQst (ActChgCrsTT1stDay + 216) -#define ActSeeSvy (ActChgCrsTT1stDay + 215) -#define ActAnsSvy (ActChgCrsTT1stDay + 216) -#define ActFrmNewSvy (ActChgCrsTT1stDay + 217) -#define ActEdiOneSvy (ActChgCrsTT1stDay + 218) -#define ActNewSvy (ActChgCrsTT1stDay + 219) -#define ActChgSvy (ActChgCrsTT1stDay + 220) -#define ActReqRemSvy (ActChgCrsTT1stDay + 221) -#define ActRemSvy (ActChgCrsTT1stDay + 222) -#define ActReqRstSvy (ActChgCrsTT1stDay + 223) -#define ActRstSvy (ActChgCrsTT1stDay + 224) -#define ActHidSvy (ActChgCrsTT1stDay + 225) -#define ActShoSvy (ActChgCrsTT1stDay + 226) -#define ActEdiOneSvyQst (ActChgCrsTT1stDay + 227) -#define ActRcvSvyQst (ActChgCrsTT1stDay + 228) -#define ActReqRemSvyQst (ActChgCrsTT1stDay + 229) -#define ActRemSvyQst (ActChgCrsTT1stDay + 230) +#define ActSeeSvy (ActChgCrsTT1stDay + 217) +#define ActAnsSvy (ActChgCrsTT1stDay + 218) +#define ActFrmNewSvy (ActChgCrsTT1stDay + 219) +#define ActEdiOneSvy (ActChgCrsTT1stDay + 220) +#define ActNewSvy (ActChgCrsTT1stDay + 221) +#define ActChgSvy (ActChgCrsTT1stDay + 222) +#define ActReqRemSvy (ActChgCrsTT1stDay + 223) +#define ActRemSvy (ActChgCrsTT1stDay + 224) +#define ActReqRstSvy (ActChgCrsTT1stDay + 225) +#define ActRstSvy (ActChgCrsTT1stDay + 226) +#define ActHidSvy (ActChgCrsTT1stDay + 227) +#define ActShoSvy (ActChgCrsTT1stDay + 228) +#define ActEdiOneSvyQst (ActChgCrsTT1stDay + 229) +#define ActRcvSvyQst (ActChgCrsTT1stDay + 230) +#define ActReqRemSvyQst (ActChgCrsTT1stDay + 231) +#define ActRemSvyQst (ActChgCrsTT1stDay + 232) -#define ActSeeOneExaAnn (ActChgCrsTT1stDay + 231) -#define ActSeeDatExaAnn (ActChgCrsTT1stDay + 232) -#define ActEdiExaAnn (ActChgCrsTT1stDay + 233) -#define ActRcvExaAnn (ActChgCrsTT1stDay + 234) -#define ActPrnExaAnn (ActChgCrsTT1stDay + 235) -#define ActReqRemExaAnn (ActChgCrsTT1stDay + 236) -#define ActRemExaAnn (ActChgCrsTT1stDay + 237) -#define ActHidExaAnn (ActChgCrsTT1stDay + 238) -#define ActShoExaAnn (ActChgCrsTT1stDay + 239) +#define ActSeeOneExaAnn (ActChgCrsTT1stDay + 233) +#define ActSeeDatExaAnn (ActChgCrsTT1stDay + 234) +#define ActEdiExaAnn (ActChgCrsTT1stDay + 235) +#define ActRcvExaAnn (ActChgCrsTT1stDay + 236) +#define ActPrnExaAnn (ActChgCrsTT1stDay + 237) +#define ActReqRemExaAnn (ActChgCrsTT1stDay + 238) +#define ActRemExaAnn (ActChgCrsTT1stDay + 239) +#define ActHidExaAnn (ActChgCrsTT1stDay + 240) +#define ActShoExaAnn (ActChgCrsTT1stDay + 241) /*****************************************************************************/ /******************************** Files tab **********************************/ diff --git a/swad_changelog.h b/swad_changelog.h index d47ec646..5219ef91 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -544,10 +544,15 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - * En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 19.210.4 (2020-05-05)" +#define Log_PLATFORM_VERSION "SWAD 19.211 (2020-05-05)" #define CSS_FILE "swad19.193.1.css" #define JS_FILE "swad19.193.1.js" /* + + Version 19.211: May 05, 2020 Exam events can be hidden. (301215 lines) + 1 change necessary in database: +ALTER TABLE exa_events ADD COLUMN Hidden ENUM('N','Y') NOT NULL DEFAULT 'N' AFTER ExaCod; + Version 19.210.4: May 05, 2020 Fixed bug searching courses. (301103 lines) Version 19.210.3: May 03, 2020 All figures cacheable are cached everytime they are calculated. (301089 lines) Version 19.210.2: May 03, 2020 More figures cached. (301125 lines) diff --git a/swad_database.c b/swad_database.c index 58095d08..b94a722a 100644 --- a/swad_database.c +++ b/swad_database.c @@ -1045,6 +1045,7 @@ mysql> DESCRIBE exa_events; +----------------+------------------------------------------------+------+-----+---------+----------------+ | EvtCod | int(11) | NO | PRI | NULL | auto_increment | | ExaCod | int(11) | NO | MUL | NULL | | +| Hidden | enum('N','Y') | NO | | N | | | UsrCod | int(11) | NO | | NULL | | | StartTime | datetime | NO | | NULL | | | EndTime | datetime | NO | | NULL | | @@ -1057,11 +1058,12 @@ mysql> DESCRIBE exa_events; | ShowQstResults | enum('N','Y') | NO | | N | | | ShowUsrResults | enum('N','Y') | NO | | N | | +----------------+------------------------------------------------+------+-----+---------+----------------+ -13 rows in set (0.00 sec) +14 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS exa_events (" "EvtCod INT NOT NULL AUTO_INCREMENT," "ExaCod INT NOT NULL," + "Hidden ENUM('N','Y') NOT NULL DEFAULT 'N'," "UsrCod INT NOT NULL," "StartTime DATETIME NOT NULL," "EndTime DATETIME NOT NULL," diff --git a/swad_exam.c b/swad_exam.c index 4d8ea425..18eb867c 100644 --- a/swad_exam.c +++ b/swad_exam.c @@ -126,7 +126,7 @@ static void Exa_WriteAuthor (struct Exa_Exam *Exam); static void Exa_PutHiddenParamExamOrder (Exa_Order_t SelectedOrder); -static void Exa_PutFormsToRemEditOneExam (struct Exa_Exams *Exams, +static void Exa_PutIconsToRemEditOneExam (struct Exa_Exams *Exams, const struct Exa_Exam *Exam, const char *Anchor); @@ -252,11 +252,11 @@ void Exa_ResetExam (struct Exa_Exam *Exam) Exam->TimeUTC[Dat_START_TIME] = (time_t) 0; Exam->TimeUTC[Dat_END_TIME ] = (time_t) 0; Exam->Title[0] = '\0'; + Exam->Hidden = false; Exam->NumSets = 0; Exam->NumQsts = 0; Exam->NumEvts = 0; Exam->NumUnfinishedEvts = 0; - Exam->Hidden = false; } /*****************************************************************************/ @@ -582,7 +582,7 @@ static void Exa_ShowOneExam (struct Exa_Exams *Exams, HTM_TD_Begin ("rowspan=\"2\" class=\"CONTEXT_COL COLOR%u\"",Gbl.RowEvenOdd); /* Icons to remove/edit this exam */ - Exa_PutFormsToRemEditOneExam (Exams,Exam,Anchor); + Exa_PutIconsToRemEditOneExam (Exams,Exam,Anchor); HTM_TD_End (); } @@ -758,7 +758,7 @@ static void Exa_PutHiddenParamExamOrder (Exa_Order_t SelectedOrder) /******************** Put a link (form) to edit one exam *********************/ /*****************************************************************************/ -static void Exa_PutFormsToRemEditOneExam (struct Exa_Exams *Exams, +static void Exa_PutIconsToRemEditOneExam (struct Exa_Exams *Exams, const struct Exa_Exam *Exam, const char *Anchor) { @@ -1424,7 +1424,7 @@ void Exa_HideExam (void) } /*****************************************************************************/ -/******************************** Show an exam ******************************/ +/******************************* Unhide an exam ******************************/ /*****************************************************************************/ void Exa_UnhideExam (void) @@ -1452,8 +1452,8 @@ void Exa_UnhideExam (void) Exa_GetDataOfExamByCod (&Exam); Exams.ExaCod = Exam.ExaCod; - /***** Show exam *****/ - DB_QueryUPDATE ("can not show exam", + /***** Unhide exam *****/ + DB_QueryUPDATE ("can not unhide exam", "UPDATE exa_exams SET Hidden='N' WHERE ExaCod=%ld", Exam.ExaCod); diff --git a/swad_exam_event.c b/swad_exam_event.c index d123c26b..9652843d 100644 --- a/swad_exam_event.c +++ b/swad_exam_event.c @@ -114,10 +114,12 @@ static void ExaEvt_ListOneOrMoreEventsHeading (bool ICanEditEvents); static bool ExaEvt_CheckIfICanEditEvents (void); static bool ExaEvt_CheckIfICanEditThisEvent (const struct ExaEvt_Event *Event); static void ExaEvt_ListOneOrMoreEventsIcons (struct Exa_Exams *Exams, - const struct ExaEvt_Event *Event); + const struct ExaEvt_Event *Event, + const char *Anchor); static void ExaEvt_ListOneOrMoreEventsAuthor (const struct ExaEvt_Event *Event); static void ExaEvt_ListOneOrMoreEventsTimes (const struct ExaEvt_Event *Event,unsigned UniqueId); -static void ExaEvt_ListOneOrMoreEventsTitleGrps (const struct ExaEvt_Event *Event); +static void ExaEvt_ListOneOrMoreEventsTitleGrps (const struct ExaEvt_Event *Event, + const char *Anchor); static void ExaEvt_GetAndWriteNamesOfGrpsAssociatedToEvent (const struct ExaEvt_Event *Event); static void ExaEvt_ListOneOrMoreEventsNumParticipants (const struct ExaEvt_Event *Event); static void ExaEvt_ListOneOrMoreEventsStatus (struct ExaEvt_Event *Event,unsigned NumQsts); @@ -253,13 +255,18 @@ long ExaEvt_GetEvtCodBeingPlayed (void) void ExaEvt_ResetEvent (struct ExaEvt_Event *Event) { + Dat_StartEndTime_t StartEndTime; + /***** Initialize to empty match *****/ Event->EvtCod = -1L; Event->ExaCod = -1L; Event->UsrCod = -1L; - Event->TimeUTC[Dat_START_TIME] = (time_t) 0; - Event->TimeUTC[Dat_END_TIME ] = (time_t) 0; + for (StartEndTime = (Dat_StartEndTime_t) 0; + StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1); + StartEndTime++) + Event->TimeUTC[StartEndTime] = (time_t) 0; Event->Title[0] = '\0'; + Event->Hidden = false; Event->Status.QstInd = 0; Event->Status.QstCod = -1L; Event->Status.QstStartTimeUTC = (time_t) 0; @@ -309,19 +316,20 @@ void ExaEvt_ListEvents (struct Exa_Exams *Exams, /* Make query */ NumEvents = (unsigned) DB_QuerySELECT (&mysql_res,"can not get events", - "SELECT EvtCod," // row[ 0] - "ExaCod," // row[ 1] - "UsrCod," // row[ 2] - "UNIX_TIMESTAMP(StartTime)," // row[ 3] - "UNIX_TIMESTAMP(EndTime)," // row[ 4] - "Title," // row[ 5] - "QstInd," // row[ 6] - "QstCod," // row[ 7] - "Showing," // row[ 8] - "Countdown," // row[ 9] - "NumCols," // row[10] - "ShowQstResults," // row[11] - "ShowUsrResults" // row[12] + "SELECT EvtCod," // row[ 0] + "ExaCod," // row[ 1] + "Hidden," // row[ 2] + "UsrCod," // row[ 3] + "UNIX_TIMESTAMP(StartTime)," // row[ 4] + "UNIX_TIMESTAMP(EndTime)," // row[ 5] + "Title," // row[ 6] + "QstInd," // row[ 7] + "QstCod," // row[ 8] + "Showing," // row[ 9] + "Countdown," // row[10] + "NumCols," // row[11] + "ShowQstResults," // row[12] + "ShowUsrResults" // row[13] " FROM exa_events" " WHERE ExaCod=%ld%s" " ORDER BY EvtCod", @@ -391,55 +399,37 @@ void ExaEvt_GetDataOfEventByCod (struct ExaEvt_Event *Event) { MYSQL_RES *mysql_res; unsigned long NumRows; - Dat_StartEndTime_t StartEndTime; /***** Get exam data event from database *****/ - NumRows = (unsigned) DB_QuerySELECT (&mysql_res,"can not get events", - "SELECT EvtCod," // row[ 0] - "ExaCod," // row[ 1] - "UsrCod," // row[ 2] - "UNIX_TIMESTAMP(StartTime)," // row[ 3] - "UNIX_TIMESTAMP(EndTime)," // row[ 4] - "Title," // row[ 5] - "QstInd," // row[ 6] - "QstCod," // row[ 7] - "Showing," // row[ 8] - "Countdown," // row[ 9] - "NumCols," // row[10] - "ShowQstResults," // row[11] - "ShowUsrResults" // row[12] - " FROM exa_events" - " WHERE EvtCod=%ld" - " AND ExaCod IN" // Extra check - " (SELECT ExaCod FROM exa_exams" - " WHERE CrsCod='%ld')", - Event->EvtCod, - Gbl.Hierarchy.Crs.CrsCod); + NumRows = (unsigned) + DB_QuerySELECT (&mysql_res,"can not get events", + "SELECT EvtCod," // row[ 0] + "ExaCod," // row[ 1] + "Hidden," // row[ 2] + "UsrCod," // row[ 3] + "UNIX_TIMESTAMP(StartTime),"// row[ 4] + "UNIX_TIMESTAMP(EndTime)," // row[ 5] + "Title," // row[ 6] + "QstInd," // row[ 7] + "QstCod," // row[ 8] + "Showing," // row[ 9] + "Countdown," // row[10] + "NumCols," // row[11] + "ShowQstResults," // row[12] + "ShowUsrResults" // row[13] + " FROM exa_events" + " WHERE EvtCod=%ld" + " AND ExaCod IN" // Extra check + " (SELECT ExaCod FROM exa_exams" + " WHERE CrsCod='%ld')", + Event->EvtCod, + Gbl.Hierarchy.Crs.CrsCod); if (NumRows) // Event found... - /***** Get exam event data from row *****/ + /* Get exam event data from row */ ExaEvt_GetEventDataFromRow (mysql_res,Event); else - { /* Initialize to empty exam event */ - Event->EvtCod = -1L; - Event->ExaCod = -1L; - Event->UsrCod = -1L; - for (StartEndTime = (Dat_StartEndTime_t) 0; - StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1); - StartEndTime++) - Event->TimeUTC[StartEndTime] = (time_t) 0; - Event->Title[0] = '\0'; - Event->Status.QstInd = 0; - Event->Status.QstCod = -1L; - Event->Status.QstStartTimeUTC = (time_t) 0; - Event->Status.Showing = ExaEvt_START; - Event->Status.Countdown = -1L; - Event->Status.Happening = false; - Event->Status.NumParticipants = 0; - Event->Status.NumCols = ExaEvt_NUM_COLS_DEFAULT; - Event->Status.ShowQstResults = false; - Event->Status.ShowUsrResults = false; - } + ExaEvt_ResetEvent (Event); /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); @@ -487,6 +477,7 @@ static void ExaEvt_ListOneOrMoreEvents (struct Exa_Exams *Exams, { unsigned NumEvent; unsigned UniqueId; + char *Anchor; struct ExaEvt_Event Event; bool ICanEditEvents = ExaEvt_CheckIfICanEditEvents (); @@ -513,12 +504,17 @@ static void ExaEvt_ListOneOrMoreEvents (struct Exa_Exams *Exams, if (ExaEvt_CheckIfICanPlayThisEventBasedOnGrps (&Event)) { - /***** Write row for this exam event ****/ + /***** Build anchor string *****/ + if (asprintf (&Anchor,"evt_%ld_%ld",Exam->ExaCod,Event.EvtCod) < 0) + Lay_NotEnoughMemoryExit (); + + /***** Begin row for this exam event ****/ HTM_TR_Begin (NULL); /* Icons */ if (ICanEditEvents) - ExaEvt_ListOneOrMoreEventsIcons (Exams,&Event); + if (ExaEvt_CheckIfICanEditThisEvent (&Event)) + ExaEvt_ListOneOrMoreEventsIcons (Exams,&Event,Anchor); /* Event participant */ ExaEvt_ListOneOrMoreEventsAuthor (&Event); @@ -527,7 +523,7 @@ static void ExaEvt_ListOneOrMoreEvents (struct Exa_Exams *Exams, ExaEvt_ListOneOrMoreEventsTimes (&Event,UniqueId); /* Title and groups */ - ExaEvt_ListOneOrMoreEventsTitleGrps (&Event); + ExaEvt_ListOneOrMoreEventsTitleGrps (&Event,Anchor); /* Number of participants who have answered any question in the exam event */ ExaEvt_ListOneOrMoreEventsNumParticipants (&Event); @@ -537,6 +533,12 @@ static void ExaEvt_ListOneOrMoreEvents (struct Exa_Exams *Exams, /* Event result visible? */ ExaEvt_ListOneOrMoreEventsResult (Exams,&Event); + + /***** End row for this exam event ****/ + HTM_TR_End (); + + /***** Free anchor string *****/ + free (Anchor); } } @@ -617,22 +619,29 @@ static bool ExaEvt_CheckIfICanEditThisEvent (const struct ExaEvt_Event *Event) /*****************************************************************************/ static void ExaEvt_ListOneOrMoreEventsIcons (struct Exa_Exams *Exams, - const struct ExaEvt_Event *Event) + const struct ExaEvt_Event *Event, + const char *Anchor) { HTM_TD_Begin ("class=\"BT%u\"",Gbl.RowEvenOdd); - /***** Put icon to remove the exam event *****/ - if (ExaEvt_CheckIfICanEditThisEvent (Event)) - { - Exams->ExaCod = Event->ExaCod; - Exams->EvtCod = Event->EvtCod; - Frm_StartForm (ActReqRemExaEvt); - ExaEvt_PutParamsEdit (Exams); - Ico_PutIconRemove (); - Frm_EndForm (); - } + Exams->ExaCod = Event->ExaCod; + Exams->EvtCod = Event->EvtCod; + + /* Icon to remove the exam event */ + Frm_StartForm (ActReqRemExaEvt); + ExaEvt_PutParamsEdit (Exams); + Ico_PutIconRemove (); + Frm_EndForm (); + + /* Icon to hide/unhide the exam event */ + if (Event->Hidden) + Ico_PutContextualIconToUnhide (ActShoExaEvt,Anchor, + ExaEvt_PutParamsEdit,Exams); else - Ico_PutIconRemovalNotAllowed (); + Ico_PutContextualIconToHide (ActHidExaEvt,Anchor, + ExaEvt_PutParamsEdit,Exams); + + /* Icon to edit the exam event */ HTM_TD_End (); } @@ -645,7 +654,7 @@ static void ExaEvt_ListOneOrMoreEventsAuthor (const struct ExaEvt_Event *Event) { /***** Event author (teacher) *****/ HTM_TD_Begin ("class=\"LT COLOR%u\"",Gbl.RowEvenOdd); - Usr_WriteAuthor1Line (Event->UsrCod,false); + Usr_WriteAuthor1Line (Event->UsrCod,Event->Hidden); HTM_TD_End (); } @@ -656,19 +665,24 @@ static void ExaEvt_ListOneOrMoreEventsAuthor (const struct ExaEvt_Event *Event) static void ExaEvt_ListOneOrMoreEventsTimes (const struct ExaEvt_Event *Event,unsigned UniqueId) { Dat_StartEndTime_t StartEndTime; + const char *Color; char *Id; for (StartEndTime = (Dat_StartEndTime_t) 0; StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1); StartEndTime++) { + Color = Event->Status.Showing == ExaEvt_END ? (Event->Hidden ? "DATE_GREEN_LIGHT": + "DATE_GREEN") : + (Event->Hidden ? "DATE_RED_LIGHT": + "DATE_RED"); + + + if (asprintf (&Id,"exa_time_%u_%u",(unsigned) StartEndTime,UniqueId) < 0) Lay_NotEnoughMemoryExit (); HTM_TD_Begin ("id=\"%s\" class=\"%s LT COLOR%u\"", - Id, - Event->Status.Showing == ExaEvt_END ? "DATE_RED" : - "DATE_GREEN", - Gbl.RowEvenOdd); + Id,Color,Gbl.RowEvenOdd); Dat_WriteLocalDateHMSFromUTC (Id,Event->TimeUTC[StartEndTime], Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK, true,true,true,0x7); @@ -681,7 +695,8 @@ static void ExaEvt_ListOneOrMoreEventsTimes (const struct ExaEvt_Event *Event,un /*************** Put a column for exam event title and grous *****************/ /*****************************************************************************/ -static void ExaEvt_ListOneOrMoreEventsTitleGrps (const struct ExaEvt_Event *Event) +static void ExaEvt_ListOneOrMoreEventsTitleGrps (const struct ExaEvt_Event *Event, + const char *Anchor) { extern const char *Txt_Play; extern const char *Txt_Resume; @@ -689,15 +704,19 @@ static void ExaEvt_ListOneOrMoreEventsTitleGrps (const struct ExaEvt_Event *Even HTM_TD_Begin ("class=\"LT COLOR%u\"",Gbl.RowEvenOdd); /***** Event title *****/ + HTM_ARTICLE_Begin (Anchor); Frm_StartForm (Gbl.Usrs.Me.Role.Logged == Rol_STD ? ActJoiExaEvt : ActResExaEvt); ExaEvt_PutParamEvtCod (Event->EvtCod); HTM_BUTTON_SUBMIT_Begin (Gbl.Usrs.Me.Role.Logged == Rol_STD ? Txt_Play : Txt_Resume, - "BT_LINK LT ASG_TITLE",NULL); + Event->Hidden ? "BT_LINK LT ASG_TITLE_LIGHT": + "BT_LINK LT ASG_TITLE", + NULL); HTM_Txt (Event->Title); HTM_BUTTON_End (); Frm_EndForm (); + HTM_ARTICLE_End (); /***** Groups whose students can answer this exam event *****/ if (Gbl.Crs.Grps.NumGrps) @@ -732,7 +751,8 @@ static void ExaEvt_GetAndWriteNamesOfGrpsAssociatedToEvent (const struct ExaEvt_ Event->EvtCod); /***** Write heading *****/ - HTM_DIV_Begin ("class=\"ASG_GRP\""); + HTM_DIV_Begin ("class=\"%s\"",Event->Hidden ? "ASG_GRP_LIGHT": + "ASG_GRP"); HTM_TxtColonNBSP (NumRows == 1 ? Txt_Group : Txt_Groups); @@ -964,10 +984,11 @@ static void ExaEvt_GetEventDataFromRow (MYSQL_RES *mysql_res, /* row[ 0] EvtCod row[ 1] ExaCod - row[ 2] UsrCod - row[ 3] UNIX_TIMESTAMP(StartTime) - row[ 4] UNIX_TIMESTAMP(EndTime) - row[ 5] Title + row[ 2] Hidden + row[ 3] UsrCod + row[ 4] UNIX_TIMESTAMP(StartTime) + row[ 5] UNIX_TIMESTAMP(EndTime) + row[ 6] Title */ /***** Get exam event data *****/ /* Code of the exam event (row[0]) */ @@ -978,55 +999,58 @@ static void ExaEvt_GetEventDataFromRow (MYSQL_RES *mysql_res, if ((Event->ExaCod = Str_ConvertStrCodToLongCod (row[1])) <= 0) Lay_ShowErrorAndExit ("Wrong code of exam."); - /* Get exam event teacher (row[2]) */ - Event->UsrCod = Str_ConvertStrCodToLongCod (row[2]); + /* Get whether the exam is hidden (row[2]) */ + Event->Hidden = (row[2][0] == 'Y'); - /* Get start/end times (row[3], row[4] hold start/end UTC times) */ + /* Get exam event teacher (row[3]) */ + Event->UsrCod = Str_ConvertStrCodToLongCod (row[3]); + + /* Get start/end times (row[4], row[5] hold start/end UTC times) */ for (StartEndTime = (Dat_StartEndTime_t) 0; StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1); StartEndTime++) - Event->TimeUTC[StartEndTime] = Dat_GetUNIXTimeFromStr (row[3 + StartEndTime]); + Event->TimeUTC[StartEndTime] = Dat_GetUNIXTimeFromStr (row[4 + StartEndTime]); - /* Get the title of the exam (row[5]) */ - if (row[5]) - Str_Copy (Event->Title,row[5], + /* Get the title of the exam (row[6]) */ + if (row[6]) + Str_Copy (Event->Title,row[6], Exa_MAX_BYTES_TITLE); else Event->Title[0] = '\0'; /***** Get current exam event status *****/ /* - row[ 6] QstInd - row[ 7] QstCod - row[ 8] Showing - row[ 9] Countdown - row[10] NumCols - row[11] ShowQstResults - row[12] ShowUsrResults + row[ 7] QstInd + row[ 8] QstCod + row[ 9] Showing + row[10] Countdown + row[11] NumCols + row[12] ShowQstResults + row[13] ShowUsrResults */ - /* Current question index (row[6]) */ - Event->Status.QstInd = Str_ConvertStrToUnsigned (row[6]); + /* Current question index (row[7]) */ + Event->Status.QstInd = Str_ConvertStrToUnsigned (row[7]); - /* Current question code (row[7]) */ - Event->Status.QstCod = Str_ConvertStrCodToLongCod (row[7]); + /* Current question code (row[8]) */ + Event->Status.QstCod = Str_ConvertStrCodToLongCod (row[8]); - /* Get what to show (stem, answers, results) (row(8)) */ - Event->Status.Showing = ExaEvt_GetShowingFromStr (row[8]); + /* Get what to show (stem, answers, results) (row(9)) */ + Event->Status.Showing = ExaEvt_GetShowingFromStr (row[9]); - /* Get countdown (row[9]) */ - Event->Status.Countdown = Str_ConvertStrCodToLongCod (row[9]); + /* Get countdown (row[10]) */ + Event->Status.Countdown = Str_ConvertStrCodToLongCod (row[10]); - /* Get number of columns (row[10]) */ - LongNum = Str_ConvertStrCodToLongCod (row[10]); + /* Get number of columns (row[11]) */ + LongNum = Str_ConvertStrCodToLongCod (row[11]); Event->Status.NumCols = (LongNum <= 1 ) ? 1 : ((LongNum >= ExaEvt_MAX_COLS) ? ExaEvt_MAX_COLS : - (unsigned) LongNum); + (unsigned) LongNum); - /* Get whether to show question results or not (row(11)) */ - Event->Status.ShowQstResults = (row[11][0] == 'Y'); + /* Get whether to show question results or not (row(12)) */ + Event->Status.ShowQstResults = (row[12][0] == 'Y'); - /* Get whether to show user results or not (row(12)) */ - Event->Status.ShowUsrResults = (row[12][0] == 'Y'); + /* Get whether to show user results or not (row(13)) */ + Event->Status.ShowUsrResults = (row[13][0] == 'Y'); /***** Get whether the exam event is being played or not *****/ if (Event->Status.Showing == ExaEvt_END) // Event over @@ -1261,6 +1285,78 @@ static void ExaEvt_RemoveUsrEvtResultsInCrs (long UsrCod,long CrsCod,const char UsrCod); } +/*****************************************************************************/ +/******************************** Hide an event ******************************/ +/*****************************************************************************/ + +void ExaEvt_HideEvent (void) + { + struct Exa_Exams Exams; + struct Exa_Exam Exam; + struct ExaEvt_Event Event; + + /***** Reset exams context *****/ + Exa_ResetExams (&Exams); + + /***** Reset exam and event *****/ + Exa_ResetExam (&Exam); + ExaEvt_ResetEvent (&Event); + + /***** Get and check parameters *****/ + ExaEvt_GetAndCheckParameters (&Exams,&Exam,&Event); + + /***** Check if I can remove this exam event *****/ + if (!ExaEvt_CheckIfICanEditThisEvent (&Event)) + Lay_NoPermissionExit (); + + /***** Hide event *****/ + DB_QueryUPDATE ("can not hide exam event", + "UPDATE exa_events SET Hidden='Y'" + " WHERE EvtCod=%ld" + " AND ExaCod=%ld", // Extra check + Event.EvtCod,Event.ExaCod); + + /***** Show current exam *****/ + Exa_ShowOnlyOneExam (&Exams,&Exam, + false); // Do not put form to start new exam event + } + +/*****************************************************************************/ +/****************************** Unhide an event ******************************/ +/*****************************************************************************/ + +void ExaEvt_UnhideEvent (void) + { + struct Exa_Exams Exams; + struct Exa_Exam Exam; + struct ExaEvt_Event Event; + + /***** Reset exams context *****/ + Exa_ResetExams (&Exams); + + /***** Reset exam and event *****/ + Exa_ResetExam (&Exam); + ExaEvt_ResetEvent (&Event); + + /***** Get and check parameters *****/ + ExaEvt_GetAndCheckParameters (&Exams,&Exam,&Event); + + /***** Check if I can remove this exam event *****/ + if (!ExaEvt_CheckIfICanEditThisEvent (&Event)) + Lay_NoPermissionExit (); + + /***** Unhide event *****/ + DB_QueryUPDATE ("can not unhide exam event", + "UPDATE exa_events SET Hidden='N'", + " WHERE EvtCod=%ld" + " AND ExaCod=%ld", // Extra check + Event.EvtCod,Event.ExaCod); + + /***** Show current exam *****/ + Exa_ShowOnlyOneExam (&Exams,&Exam, + false); // Do not put form to start new exam event + } + /*****************************************************************************/ /******************** Params used to edit an exam event **********************/ /*****************************************************************************/ diff --git a/swad_exam_event.h b/swad_exam_event.h index a03490a0..4d267bd8 100644 --- a/swad_exam_event.h +++ b/swad_exam_event.h @@ -56,6 +56,7 @@ struct ExaEvt_Event long UsrCod; time_t TimeUTC[Dat_NUM_START_END_TIME]; char Title[Exa_MAX_BYTES_TITLE + 1]; + bool Hidden; struct { unsigned QstInd; // 0 means that the exam has not started. First question has index 1. @@ -101,6 +102,9 @@ void ExaEvt_RemoveEventsInExamFromAllTables (long ExaCod); void ExaEvt_RemoveEventInCourseFromAllTables (long CrsCod); void ExaEvt_RemoveUsrFromEventTablesInCrs (long UsrCod,long CrsCod); +void ExaEvt_HideEvent (void); +void ExaEvt_UnhideEvent (void); + void ExaEvt_PutParamsEdit (void *Exams); void ExaEvt_GetAndCheckParameters (struct Exa_Exams *Exams, struct Exa_Exam *Exam, diff --git a/swad_figure_cache.c b/swad_figure_cache.c index 2b6d9882..818fd620 100644 --- a/swad_figure_cache.c +++ b/swad_figure_cache.c @@ -104,12 +104,12 @@ bool FigCch_GetFigureFromCache (FigCch_FigureCached_t Figure, time_t TimeCached[Hie_NUM_LEVELS] = // Time in seconds { [Hie_UNK] = (time_t) ( 0), // Unknown - [Hie_SYS] = (time_t) ( 1UL * 60UL * 60UL), // System - [Hie_CTY] = (time_t) ( 30UL * 60UL), // Country - [Hie_INS] = (time_t) ( 15UL * 60UL), // Institution - [Hie_CTR] = (time_t) ( 5UL * 60UL), // Centre - [Hie_DEG] = (time_t) ( 60UL), // Degree - [Hie_CRS] = (time_t) ( 10UL), // Course + [Hie_SYS] = (time_t) (24UL * 60UL * 60UL), // System + [Hie_CTY] = (time_t) (12UL * 60UL * 60UL), // Country + [Hie_INS] = (time_t) ( 6UL * 60UL * 60UL), // Institution + [Hie_CTR] = (time_t) ( 3UL * 60UL * 60UL), // Centre + [Hie_DEG] = (time_t) ( 1UL * 60UL * 60UL), // Degree + [Hie_CRS] = (time_t) ( 60UL), // Course }; static const char *Field[FigCch_NUM_TYPES] = { diff --git a/swad_match.c b/swad_match.c index 9a7cada5..67c7b418 100644 --- a/swad_match.c +++ b/swad_match.c @@ -253,12 +253,16 @@ long Mch_GetMchCodBeingPlayed (void) void Mch_ResetMatch (struct Mch_Match *Match) { + Dat_StartEndTime_t StartEndTime; + /***** Initialize to empty match *****/ Match->MchCod = -1L; Match->GamCod = -1L; Match->UsrCod = -1L; - Match->TimeUTC[Dat_START_TIME] = (time_t) 0; - Match->TimeUTC[Dat_END_TIME ] = (time_t) 0; + for (StartEndTime = (Dat_StartEndTime_t) 0; + StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1); + StartEndTime++) + Match->TimeUTC[StartEndTime] = (time_t) 0; Match->Title[0] = '\0'; Match->Status.QstInd = 0; Match->Status.QstCod = -1L; @@ -379,55 +383,36 @@ void Mch_GetDataOfMatchByCod (struct Mch_Match *Match) { MYSQL_RES *mysql_res; unsigned long NumRows; - Dat_StartEndTime_t StartEndTime; /***** Get data of match from database *****/ - NumRows = (unsigned) DB_QuerySELECT (&mysql_res,"can not get matches", - "SELECT MchCod," // row[ 0] - "GamCod," // row[ 1] - "UsrCod," // row[ 2] - "UNIX_TIMESTAMP(StartTime)," // row[ 3] - "UNIX_TIMESTAMP(EndTime)," // row[ 4] - "Title," // row[ 5] - "QstInd," // row[ 6] - "QstCod," // row[ 7] - "Showing," // row[ 8] - "Countdown," // row[ 9] - "NumCols," // row[10] - "ShowQstResults," // row[11] - "ShowUsrResults" // row[12] - " FROM mch_matches" - " WHERE MchCod=%ld" - " AND GamCod IN" // Extra check - " (SELECT GamCod FROM gam_games" - " WHERE CrsCod='%ld')", - Match->MchCod, - Gbl.Hierarchy.Crs.CrsCod); + NumRows = (unsigned) + DB_QuerySELECT (&mysql_res,"can not get matches", + "SELECT MchCod," // row[ 0] + "GamCod," // row[ 1] + "UsrCod," // row[ 2] + "UNIX_TIMESTAMP(StartTime),"// row[ 3] + "UNIX_TIMESTAMP(EndTime)," // row[ 4] + "Title," // row[ 5] + "QstInd," // row[ 6] + "QstCod," // row[ 7] + "Showing," // row[ 8] + "Countdown," // row[ 9] + "NumCols," // row[10] + "ShowQstResults," // row[11] + "ShowUsrResults" // row[12] + " FROM mch_matches" + " WHERE MchCod=%ld" + " AND GamCod IN" // Extra check + " (SELECT GamCod FROM gam_games" + " WHERE CrsCod='%ld')", + Match->MchCod, + Gbl.Hierarchy.Crs.CrsCod); if (NumRows) // Match found... - /***** Get match data from row *****/ + /* Get match data from row */ Mch_GetMatchDataFromRow (mysql_res,Match); else - { /* Initialize to empty match */ - Match->MchCod = -1L; - Match->GamCod = -1L; - Match->UsrCod = -1L; - for (StartEndTime = (Dat_StartEndTime_t) 0; - StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1); - StartEndTime++) - Match->TimeUTC[StartEndTime] = (time_t) 0; - Match->Title[0] = '\0'; - Match->Status.QstInd = 0; - Match->Status.QstCod = -1L; - Match->Status.QstStartTimeUTC = (time_t) 0; - Match->Status.Showing = Mch_START; - Match->Status.Countdown = -1L; - Match->Status.Playing = false; - Match->Status.NumPlayers = 0; - Match->Status.NumCols = Mch_NUM_COLS_DEFAULT; - Match->Status.ShowQstResults = false; - Match->Status.ShowUsrResults = false; - } + Mch_ResetMatch (Match); /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); @@ -501,7 +486,7 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games, if (Mch_CheckIfICanPlayThisMatchBasedOnGrps (&Match)) { - /***** Write row for this match ****/ + /***** Begin row for this match ****/ HTM_TR_Begin (NULL); /* Icons */ @@ -525,6 +510,9 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games, /* Match result visible? */ Mch_ListOneOrMoreMatchesResult (Games,&Match); + + /***** Begin row for this match ****/ + HTM_TR_Begin (NULL); } } diff --git a/swad_text_action.c b/swad_text_action.c index 82265f47..f91e539e 100644 --- a/swad_text_action.c +++ b/swad_text_action.c @@ -10119,6 +10119,48 @@ const char *Txt_Actions[Act_NUM_ACTIONS] = "" // Potrzebujesz tlumaczenie #elif L==9 // pt "" // Precisa de tradução +#endif + , + [ActHidExaEvt] = +#if L==1 // ca + "" // Necessita traducció +#elif L==2 // de + "" // Need Übersetzung +#elif L==3 // en + "Hide exam event" +#elif L==4 // es + "Ocultar evento de examen" +#elif L==5 // fr + "" // Besoin de traduction +#elif L==6 // gn + "" // Okoteve traducción +#elif L==7 // it + "" // Bisogno di traduzione +#elif L==8 // pl + "" // Potrzebujesz tlumaczenie +#elif L==9 // pt + "" // Precisa de tradução +#endif + , + [ActShoExaEvt] = +#if L==1 // ca + "" // Necessita traducció +#elif L==2 // de + "" // Need Übersetzung +#elif L==3 // en + "Unhide exam event" +#elif L==4 // es + "Mostrar evento de examen" +#elif L==5 // fr + "" // Besoin de traduction +#elif L==6 // gn + "" // Okoteve traducción +#elif L==7 // it + "" // Bisogno di traduzione +#elif L==8 // pl + "" // Potrzebujesz tlumaczenie +#elif L==9 // pt + "" // Precisa de tradução #endif , [ActReqNewExaEvt] =