From 2156852d42342054b41457b64912ee988d255be9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Wed, 26 Feb 2020 00:26:07 +0100 Subject: [PATCH] Version19.134 --- sql/swad.sql | 9 +- swad_action.c | 4 + swad_action.h | 196 ++++----- swad_changelog.h | 12 +- swad_database.c | 28 +- swad_figure.c | 4 +- swad_game.c | 63 ++- swad_game.h | 3 +- swad_global.c | 2 +- swad_global.h | 6 +- swad_group.c | 6 +- swad_group.h | 1 + swad_program.c | 981 ++++++++++++++++++++++++++++++--------------- swad_program.h | 25 +- swad_text.c | 71 +++- swad_text_action.c | 44 +- 16 files changed, 948 insertions(+), 507 deletions(-) diff --git a/sql/swad.sql b/sql/swad.sql index 33261a4c6..75fa27cd3 100644 --- a/sql/swad.sql +++ b/sql/swad.sql @@ -1028,14 +1028,15 @@ CREATE TABLE IF NOT EXISTS plugins ( -- Table prg_grp: stores the groups associated to each program item -- CREATE TABLE IF NOT EXISTS prg_grp ( - PrgIteCod INT NOT NULL, + ItmCod INT NOT NULL, GrpCod INT NOT NULL, - UNIQUE INDEX(PrgIteCod,GrpCod)); + UNIQUE INDEX(ItmCod,GrpCod)); -- -- Table prg_items: stores the items of the course program -- CREATE TABLE IF NOT EXISTS prg_items ( - PrgIteCod INT NOT NULL AUTO_INCREMENT, + ItmCod INT NOT NULL AUTO_INCREMENT, + ItmInd INT NOT NULL DEFAULT 0, CrsCod INT NOT NULL DEFAULT -1, Hidden ENUM('N','Y') NOT NULL DEFAULT 'N', UsrCod INT NOT NULL, @@ -1043,7 +1044,7 @@ CREATE TABLE IF NOT EXISTS prg_items ( EndTime DATETIME NOT NULL, Title VARCHAR(2047) NOT NULL, Txt TEXT NOT NULL, - UNIQUE INDEX(PrgIteCod), + UNIQUE INDEX(ItmCod), INDEX(CrsCod,Hidden)); -- -- Table prj_config: stores the configuration of projects for each course diff --git a/swad_action.c b/swad_action.c index 2ba9150fc..bc013896f 100644 --- a/swad_action.c +++ b/swad_action.c @@ -406,6 +406,8 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = [ActRemPrgIte ] = {1828,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RemovePrgItem ,NULL}, [ActHidPrgIte ] = {1829,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_HidePrgItem ,NULL}, [ActShoPrgIte ] = {1830,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_ShowPrgItem ,NULL}, + [ActUp_PrgIte ] = {1831,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_MoveUpPrgItem ,NULL}, + [ActDwnPrgIte ] = {1832,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_MoveDownPrgItem ,NULL}, [ActEdiTchGui ] = { 785,-1,TabUnk,ActSeeTchGui ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Inf_FormsToSelSendInfo ,NULL}, @@ -3556,6 +3558,8 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un ActRemPrgIte, // #1828 ActHidPrgIte, // #1829 ActShoPrgIte, // #1830 + ActUp_PrgIte, // #1832 + ActDwnPrgIte, // #1833 }; /*****************************************************************************/ diff --git a/swad_action.h b/swad_action.h index 399645562..946a08ff8 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 1830 +#define Act_MAX_ACTION_COD 1832 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13 @@ -392,107 +392,109 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to #define ActRemPrgIte (ActChgCrsSta + 21) #define ActHidPrgIte (ActChgCrsSta + 22) #define ActShoPrgIte (ActChgCrsSta + 23) -#define ActEdiTchGui (ActChgCrsSta + 24) -#define ActSeeSylLec (ActChgCrsSta + 25) -#define ActSeeSylPra (ActChgCrsSta + 26) -#define ActEdiSylLec (ActChgCrsSta + 27) -#define ActEdiSylPra (ActChgCrsSta + 28) -#define ActDelItmSylLec (ActChgCrsSta + 29) -#define ActDelItmSylPra (ActChgCrsSta + 30) -#define ActUp_IteSylLec (ActChgCrsSta + 31) -#define ActUp_IteSylPra (ActChgCrsSta + 32) -#define ActDwnIteSylLec (ActChgCrsSta + 33) -#define ActDwnIteSylPra (ActChgCrsSta + 34) -#define ActRgtIteSylLec (ActChgCrsSta + 35) -#define ActRgtIteSylPra (ActChgCrsSta + 36) -#define ActLftIteSylLec (ActChgCrsSta + 37) -#define ActLftIteSylPra (ActChgCrsSta + 38) -#define ActInsIteSylLec (ActChgCrsSta + 39) -#define ActInsIteSylPra (ActChgCrsSta + 40) -#define ActModIteSylLec (ActChgCrsSta + 41) -#define ActModIteSylPra (ActChgCrsSta + 42) +#define ActUp_PrgIte (ActChgCrsSta + 24) +#define ActDwnPrgIte (ActChgCrsSta + 25) +#define ActEdiTchGui (ActChgCrsSta + 26) +#define ActSeeSylLec (ActChgCrsSta + 27) +#define ActSeeSylPra (ActChgCrsSta + 28) +#define ActEdiSylLec (ActChgCrsSta + 29) +#define ActEdiSylPra (ActChgCrsSta + 30) +#define ActDelItmSylLec (ActChgCrsSta + 31) +#define ActDelItmSylPra (ActChgCrsSta + 32) +#define ActUp_IteSylLec (ActChgCrsSta + 33) +#define ActUp_IteSylPra (ActChgCrsSta + 34) +#define ActDwnIteSylLec (ActChgCrsSta + 35) +#define ActDwnIteSylPra (ActChgCrsSta + 36) +#define ActRgtIteSylLec (ActChgCrsSta + 37) +#define ActRgtIteSylPra (ActChgCrsSta + 38) +#define ActLftIteSylLec (ActChgCrsSta + 39) +#define ActLftIteSylPra (ActChgCrsSta + 40) +#define ActInsIteSylLec (ActChgCrsSta + 41) +#define ActInsIteSylPra (ActChgCrsSta + 42) +#define ActModIteSylLec (ActChgCrsSta + 43) +#define ActModIteSylPra (ActChgCrsSta + 44) -#define ActEdiBib (ActChgCrsSta + 43) -#define ActEdiFAQ (ActChgCrsSta + 44) -#define ActEdiCrsLnk (ActChgCrsSta + 45) +#define ActEdiBib (ActChgCrsSta + 45) +#define ActEdiFAQ (ActChgCrsSta + 46) +#define ActEdiCrsLnk (ActChgCrsSta + 47) -#define ActChgFrcReaCrsInf (ActChgCrsSta + 46) -#define ActChgFrcReaTchGui (ActChgCrsSta + 47) -#define ActChgFrcReaSylLec (ActChgCrsSta + 48) -#define ActChgFrcReaSylPra (ActChgCrsSta + 49) -#define ActChgFrcReaBib (ActChgCrsSta + 50) -#define ActChgFrcReaFAQ (ActChgCrsSta + 51) -#define ActChgFrcReaCrsLnk (ActChgCrsSta + 52) +#define ActChgFrcReaCrsInf (ActChgCrsSta + 48) +#define ActChgFrcReaTchGui (ActChgCrsSta + 49) +#define ActChgFrcReaSylLec (ActChgCrsSta + 50) +#define ActChgFrcReaSylPra (ActChgCrsSta + 51) +#define ActChgFrcReaBib (ActChgCrsSta + 52) +#define ActChgFrcReaFAQ (ActChgCrsSta + 53) +#define ActChgFrcReaCrsLnk (ActChgCrsSta + 54) -#define ActChgHavReaCrsInf (ActChgCrsSta + 53) -#define ActChgHavReaTchGui (ActChgCrsSta + 54) -#define ActChgHavReaSylLec (ActChgCrsSta + 55) -#define ActChgHavReaSylPra (ActChgCrsSta + 56) -#define ActChgHavReaBib (ActChgCrsSta + 57) -#define ActChgHavReaFAQ (ActChgCrsSta + 58) -#define ActChgHavReaCrsLnk (ActChgCrsSta + 59) +#define ActChgHavReaCrsInf (ActChgCrsSta + 55) +#define ActChgHavReaTchGui (ActChgCrsSta + 56) +#define ActChgHavReaSylLec (ActChgCrsSta + 57) +#define ActChgHavReaSylPra (ActChgCrsSta + 58) +#define ActChgHavReaBib (ActChgCrsSta + 59) +#define ActChgHavReaFAQ (ActChgCrsSta + 60) +#define ActChgHavReaCrsLnk (ActChgCrsSta + 61) -#define ActSelInfSrcCrsInf (ActChgCrsSta + 60) -#define ActSelInfSrcTchGui (ActChgCrsSta + 61) -#define ActSelInfSrcSylLec (ActChgCrsSta + 62) -#define ActSelInfSrcSylPra (ActChgCrsSta + 63) -#define ActSelInfSrcBib (ActChgCrsSta + 64) -#define ActSelInfSrcFAQ (ActChgCrsSta + 65) -#define ActSelInfSrcCrsLnk (ActChgCrsSta + 66) -#define ActRcvURLCrsInf (ActChgCrsSta + 67) -#define ActRcvURLTchGui (ActChgCrsSta + 68) -#define ActRcvURLSylLec (ActChgCrsSta + 69) -#define ActRcvURLSylPra (ActChgCrsSta + 70) -#define ActRcvURLBib (ActChgCrsSta + 71) -#define ActRcvURLFAQ (ActChgCrsSta + 72) -#define ActRcvURLCrsLnk (ActChgCrsSta + 73) -#define ActRcvPagCrsInf (ActChgCrsSta + 74) -#define ActRcvPagTchGui (ActChgCrsSta + 75) -#define ActRcvPagSylLec (ActChgCrsSta + 76) -#define ActRcvPagSylPra (ActChgCrsSta + 77) -#define ActRcvPagBib (ActChgCrsSta + 78) -#define ActRcvPagFAQ (ActChgCrsSta + 79) -#define ActRcvPagCrsLnk (ActChgCrsSta + 80) -#define ActEditorCrsInf (ActChgCrsSta + 81) -#define ActEditorTchGui (ActChgCrsSta + 82) -#define ActEditorSylLec (ActChgCrsSta + 83) -#define ActEditorSylPra (ActChgCrsSta + 84) -#define ActEditorBib (ActChgCrsSta + 85) -#define ActEditorFAQ (ActChgCrsSta + 86) -#define ActEditorCrsLnk (ActChgCrsSta + 87) -#define ActPlaTxtEdiCrsInf (ActChgCrsSta + 88) -#define ActPlaTxtEdiTchGui (ActChgCrsSta + 89) -#define ActPlaTxtEdiSylLec (ActChgCrsSta + 90) -#define ActPlaTxtEdiSylPra (ActChgCrsSta + 91) -#define ActPlaTxtEdiBib (ActChgCrsSta + 92) -#define ActPlaTxtEdiFAQ (ActChgCrsSta + 93) -#define ActPlaTxtEdiCrsLnk (ActChgCrsSta + 94) -#define ActRchTxtEdiCrsInf (ActChgCrsSta + 95) -#define ActRchTxtEdiTchGui (ActChgCrsSta + 96) -#define ActRchTxtEdiSylLec (ActChgCrsSta + 97) -#define ActRchTxtEdiSylPra (ActChgCrsSta + 98) -#define ActRchTxtEdiBib (ActChgCrsSta + 99) -#define ActRchTxtEdiFAQ (ActChgCrsSta + 100) -#define ActRchTxtEdiCrsLnk (ActChgCrsSta + 101) -#define ActRcvPlaTxtCrsInf (ActChgCrsSta + 102) -#define ActRcvPlaTxtTchGui (ActChgCrsSta + 103) -#define ActRcvPlaTxtSylLec (ActChgCrsSta + 104) -#define ActRcvPlaTxtSylPra (ActChgCrsSta + 105) -#define ActRcvPlaTxtBib (ActChgCrsSta + 106) -#define ActRcvPlaTxtFAQ (ActChgCrsSta + 107) -#define ActRcvPlaTxtCrsLnk (ActChgCrsSta + 108) -#define ActRcvRchTxtCrsInf (ActChgCrsSta + 109) -#define ActRcvRchTxtTchGui (ActChgCrsSta + 110) -#define ActRcvRchTxtSylLec (ActChgCrsSta + 111) -#define ActRcvRchTxtSylPra (ActChgCrsSta + 112) -#define ActRcvRchTxtBib (ActChgCrsSta + 113) -#define ActRcvRchTxtFAQ (ActChgCrsSta + 114) -#define ActRcvRchTxtCrsLnk (ActChgCrsSta + 115) +#define ActSelInfSrcCrsInf (ActChgCrsSta + 62) +#define ActSelInfSrcTchGui (ActChgCrsSta + 63) +#define ActSelInfSrcSylLec (ActChgCrsSta + 64) +#define ActSelInfSrcSylPra (ActChgCrsSta + 65) +#define ActSelInfSrcBib (ActChgCrsSta + 66) +#define ActSelInfSrcFAQ (ActChgCrsSta + 67) +#define ActSelInfSrcCrsLnk (ActChgCrsSta + 68) +#define ActRcvURLCrsInf (ActChgCrsSta + 69) +#define ActRcvURLTchGui (ActChgCrsSta + 70) +#define ActRcvURLSylLec (ActChgCrsSta + 71) +#define ActRcvURLSylPra (ActChgCrsSta + 72) +#define ActRcvURLBib (ActChgCrsSta + 73) +#define ActRcvURLFAQ (ActChgCrsSta + 74) +#define ActRcvURLCrsLnk (ActChgCrsSta + 75) +#define ActRcvPagCrsInf (ActChgCrsSta + 76) +#define ActRcvPagTchGui (ActChgCrsSta + 77) +#define ActRcvPagSylLec (ActChgCrsSta + 78) +#define ActRcvPagSylPra (ActChgCrsSta + 79) +#define ActRcvPagBib (ActChgCrsSta + 80) +#define ActRcvPagFAQ (ActChgCrsSta + 81) +#define ActRcvPagCrsLnk (ActChgCrsSta + 82) +#define ActEditorCrsInf (ActChgCrsSta + 83) +#define ActEditorTchGui (ActChgCrsSta + 84) +#define ActEditorSylLec (ActChgCrsSta + 85) +#define ActEditorSylPra (ActChgCrsSta + 86) +#define ActEditorBib (ActChgCrsSta + 87) +#define ActEditorFAQ (ActChgCrsSta + 88) +#define ActEditorCrsLnk (ActChgCrsSta + 89) +#define ActPlaTxtEdiCrsInf (ActChgCrsSta + 90) +#define ActPlaTxtEdiTchGui (ActChgCrsSta + 91) +#define ActPlaTxtEdiSylLec (ActChgCrsSta + 92) +#define ActPlaTxtEdiSylPra (ActChgCrsSta + 93) +#define ActPlaTxtEdiBib (ActChgCrsSta + 94) +#define ActPlaTxtEdiFAQ (ActChgCrsSta + 95) +#define ActPlaTxtEdiCrsLnk (ActChgCrsSta + 96) +#define ActRchTxtEdiCrsInf (ActChgCrsSta + 97) +#define ActRchTxtEdiTchGui (ActChgCrsSta + 98) +#define ActRchTxtEdiSylLec (ActChgCrsSta + 99) +#define ActRchTxtEdiSylPra (ActChgCrsSta + 100) +#define ActRchTxtEdiBib (ActChgCrsSta + 101) +#define ActRchTxtEdiFAQ (ActChgCrsSta + 102) +#define ActRchTxtEdiCrsLnk (ActChgCrsSta + 103) +#define ActRcvPlaTxtCrsInf (ActChgCrsSta + 104) +#define ActRcvPlaTxtTchGui (ActChgCrsSta + 105) +#define ActRcvPlaTxtSylLec (ActChgCrsSta + 106) +#define ActRcvPlaTxtSylPra (ActChgCrsSta + 107) +#define ActRcvPlaTxtBib (ActChgCrsSta + 108) +#define ActRcvPlaTxtFAQ (ActChgCrsSta + 109) +#define ActRcvPlaTxtCrsLnk (ActChgCrsSta + 110) +#define ActRcvRchTxtCrsInf (ActChgCrsSta + 111) +#define ActRcvRchTxtTchGui (ActChgCrsSta + 112) +#define ActRcvRchTxtSylLec (ActChgCrsSta + 113) +#define ActRcvRchTxtSylPra (ActChgCrsSta + 114) +#define ActRcvRchTxtBib (ActChgCrsSta + 115) +#define ActRcvRchTxtFAQ (ActChgCrsSta + 116) +#define ActRcvRchTxtCrsLnk (ActChgCrsSta + 117) -#define ActPrnCrsTT (ActChgCrsSta + 116) -#define ActEdiCrsTT (ActChgCrsSta + 117) -#define ActChgCrsTT (ActChgCrsSta + 118) -#define ActChgCrsTT1stDay (ActChgCrsSta + 119) +#define ActPrnCrsTT (ActChgCrsSta + 118) +#define ActEdiCrsTT (ActChgCrsSta + 119) +#define ActChgCrsTT (ActChgCrsSta + 120) +#define ActChgCrsTT1stDay (ActChgCrsSta + 121) /*****************************************************************************/ /***************************** Assessment tab ********************************/ diff --git a/swad_changelog.h b/swad_changelog.h index a85f1b134..be2522ff3 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -497,7 +497,7 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - * En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 19.133.1 (2020-02-25)" +#define Log_PLATFORM_VERSION "SWAD 19.134 (2020-02-26)" #define CSS_FILE "swad19.133.1.css" #define JS_FILE "swad19.91.1.js" /* @@ -522,6 +522,16 @@ Param // TODO: En la lista de conectados central, poner el logo de la institución a la que pertenece el usuario // 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: Order program items on indexes + + Version 19.134: Feb 26, 2020 Move up and down a course program item. Not finished. (281991 lines) + 5 changes necessary in database: +ALTER TABLE prg_items CHANGE COLUMN PrgIteCod ItmCod INT NOT NULL AUTO_INCREMENT; +ALTER TABLE prg_items ADD COLUMN ItmInd INT NOT NULL DEFAULT 0 AFTER ItmCod; +ALTER TABLE prg_grp CHANGE COLUMN PrgIteCod ItmCod INT NOT NULL; +Only if you use MyISAM: +ALTER TABLE prg_items ENGINE=MyISAM; +ALTER TABLE prg_grp ENGINE=MyISAM; Version 19.133.1: Feb 25, 2020 Changes in layout of tabs. (281610 lines) Version 19.133: Feb 25, 2020 Removed icon to print a course program item. diff --git a/swad_database.c b/swad_database.c index c826aa428..d55083797 100644 --- a/swad_database.c +++ b/swad_database.c @@ -2191,18 +2191,18 @@ mysql> DESCRIBE plugins; /***** Table prg_grp *****/ /* mysql> DESCRIBE prg_grp; -+-----------+---------+------+-----+---------+-------+ -| Field | Type | Null | Key | Default | Extra | -+-----------+---------+------+-----+---------+-------+ -| PrgIteCod | int(11) | NO | PRI | NULL | | -| GrpCod | int(11) | NO | PRI | NULL | | -+-----------+---------+------+-----+---------+-------+ -2 rows in set (0.06 sec) ++--------+---------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++--------+---------+------+-----+---------+-------+ +| ItmCod | int(11) | NO | PRI | NULL | | +| GrpCod | int(11) | NO | PRI | NULL | | ++--------+---------+------+-----+---------+-------+ +2 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS prg_grp (" - "PrgIteCod INT NOT NULL," + "ItmCod INT NOT NULL," "GrpCod INT NOT NULL," - "UNIQUE INDEX(PrgIteCod,GrpCod))"); + "UNIQUE INDEX(ItmCod,GrpCod))"); /***** Table prg_items *****/ /* @@ -2210,7 +2210,8 @@ mysql> DESCRIBE prg_items; +-----------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+---------------+------+-----+---------+----------------+ -| PrgIteCod | int(11) | NO | PRI | NULL | auto_increment | +| ItmCod | int(11) | NO | PRI | NULL | auto_increment | +| ItmInd | int(11) | NO | | 0 | | | CrsCod | int(11) | NO | MUL | -1 | | | Hidden | enum('N','Y') | NO | | N | | | UsrCod | int(11) | NO | | NULL | | @@ -2219,10 +2220,11 @@ mysql> DESCRIBE prg_items; | Title | varchar(2047) | NO | | NULL | | | Txt | text | NO | | NULL | | +-----------+---------------+------+-----+---------+----------------+ -8 rows in set (0.01 sec) +9 rows in set (0.01 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS prg_items (" - "PrgIteCod INT NOT NULL AUTO_INCREMENT," + "ItmCod INT NOT NULL AUTO_INCREMENT," + "ItmInd INT NOT NULL DEFAULT 0," "CrsCod INT NOT NULL DEFAULT -1," "Hidden ENUM('N','Y') NOT NULL DEFAULT 'N'," "UsrCod INT NOT NULL," @@ -2230,7 +2232,7 @@ mysql> DESCRIBE prg_items; "EndTime DATETIME NOT NULL," "Title VARCHAR(2047) NOT NULL," // Prg_MAX_BYTES_PROGRAM_ITEM_TITLE "Txt TEXT NOT NULL," // Cns_MAX_BYTES_TEXT - "UNIQUE INDEX(PrgIteCod)," + "UNIQUE INDEX(ItmCod)," "INDEX(CrsCod,Hidden))"); /***** Table prj_config *****/ diff --git a/swad_figure.c b/swad_figure.c index 9dd626914..149018c82 100644 --- a/swad_figure.c +++ b/swad_figure.c @@ -2956,8 +2956,8 @@ static void Fig_GetAndShowCourseProgramStats (void) // TODO: Change function fro double NumPrgItemsPerCourse = 0.0; /***** Get the number of program items from this location *****/ - if ((NumPrgItems = Prg_GetNumPrgItems (Gbl.Scope.Current))) - if ((NumCoursesWithPrgItems = Prg_GetNumCoursesWithPrgItems (Gbl.Scope.Current)) != 0) + if ((NumPrgItems = Prg_GetNumItems (Gbl.Scope.Current))) + if ((NumCoursesWithPrgItems = Prg_GetNumCoursesWithItems (Gbl.Scope.Current)) != 0) NumPrgItemsPerCourse = (double) NumPrgItems / (double) NumCoursesWithPrgItems; diff --git a/swad_game.c b/swad_game.c index d66971c0c..171170bf0 100644 --- a/swad_game.c +++ b/swad_game.c @@ -125,6 +125,8 @@ static void Gam_WriteAuthor (struct Game *Game); static void Gam_PutFormsToRemEditOneGame (const struct Game *Game, const char *Anchor); +static long Gam_GetCurrentGamCod (void); +static void Gam_PutParamsOneQst (void); static void Gam_PutParamCurrentGamCod (void); static void Gam_PutHiddenParamOrder (void); static void Gam_GetParamOrder (void); @@ -156,15 +158,11 @@ static void Gam_AllocateListSelectedQuestions (void); static void Gam_FreeListsSelectedQuestions (void); static unsigned Gam_CountNumQuestionsInList (void); -static void Gam_PutParamsOneQst (void); - static void Gam_ExchangeQuestions (long GamCod, unsigned QstIndTop,unsigned QstIndBottom); static bool Gam_CheckIfEditable (const struct Game *Game); -static long Gam_GetCurrentGamCod (void); - /*****************************************************************************/ /***************************** List all games ********************************/ /*****************************************************************************/ @@ -653,6 +651,30 @@ static void Gam_PutFormsToRemEditOneGame (const struct Game *Game, Ico_PutContextualIconToEdit (ActEdiOneGam,Gam_PutParams); } +/*****************************************************************************/ +/**************** Access to variable used to pass parameter ******************/ +/*****************************************************************************/ + +void Gam_SetCurrentGamCod (long GamCod) + { + Gam_CurrentGamCod = GamCod; + } + +static long Gam_GetCurrentGamCod (void) + { + return Gam_CurrentGamCod; + } + +/*****************************************************************************/ +/**************** Put parameter to move/remove one question ******************/ +/*****************************************************************************/ + +static void Gam_PutParamsOneQst (void) + { + Gam_PutParams (); + Gam_PutParamQstInd (Gam_CurrentQstInd); + } + /*****************************************************************************/ /*********************** Params used to edit a game **************************/ /*****************************************************************************/ @@ -1651,7 +1673,7 @@ long Gam_GetQstCodFromQstInd (long GamCod,unsigned QstInd) "SELECT QstCod FROM gam_questions" " WHERE GamCod=%ld AND QstInd=%u", GamCod,QstInd)) - Lay_ShowErrorAndExit ("Error: wrong question code."); + Lay_ShowErrorAndExit ("Error: wrong question index."); /***** Get question code (row[0]) *****/ row = mysql_fetch_row (mysql_res); @@ -1678,7 +1700,9 @@ static unsigned Gam_GetMaxQuestionIndexInGame (long GamCod) /***** Get maximum question index in a game from database *****/ DB_QuerySELECT (&mysql_res,"can not get last question index", - "SELECT MAX(QstInd) FROM gam_questions WHERE GamCod=%ld", + "SELECT MAX(QstInd)" + " FROM gam_questions" + " WHERE GamCod=%ld", GamCod); row = mysql_fetch_row (mysql_res); if (row[0]) // There are questions @@ -1735,7 +1759,7 @@ unsigned Gam_GetNextQuestionIndexInGame (long GamCod,unsigned QstInd) { MYSQL_RES *mysql_res; MYSQL_ROW row; - unsigned NextQstInd = Mch_AFTER_LAST_QUESTION; // End of questions has been reached + unsigned NextQstInd = 0; /***** Get next question index in a game from database *****/ // Although indexes are always continuous... @@ -2127,16 +2151,6 @@ static unsigned Gam_CountNumQuestionsInList (void) return NumQuestions; } -/*****************************************************************************/ -/**************** Put parameter to move/remove one question ******************/ -/*****************************************************************************/ - -static void Gam_PutParamsOneQst (void) - { - Gam_PutParams (); - Gam_PutParamQstInd (Gam_CurrentQstInd); - } - /*****************************************************************************/ /********************** Request the removal of a question ********************/ /*****************************************************************************/ @@ -2393,7 +2407,6 @@ static void Gam_ExchangeQuestions (long GamCod, "UNLOCK TABLES"); } - /*****************************************************************************/ /*********** Get number of matches and check is edition is possible **********/ /*****************************************************************************/ @@ -2727,20 +2740,6 @@ void Gam_ShowTstTagsPresentInAGame (long GamCod) DB_FreeMySQLResult (&mysql_res); } -/*****************************************************************************/ -/**************** Access to variable used to pass parameter ******************/ -/*****************************************************************************/ - -void Gam_SetCurrentGamCod (long GamCod) - { - Gam_CurrentGamCod = GamCod; - } - -static long Gam_GetCurrentGamCod (void) - { - return Gam_CurrentGamCod; - } - /*****************************************************************************/ /*************** Get maximum score of a game from database *******************/ /*****************************************************************************/ diff --git a/swad_game.h b/swad_game.h index d472585f5..84b134978 100644 --- a/swad_game.h +++ b/swad_game.h @@ -93,6 +93,7 @@ void Gam_ShowOnlyOneGameEnd (void); void Gam_PutHiddenParamGameOrder (void); void Gam_RequestCreatOrEditGame (void); +void Gam_SetCurrentGamCod (long GamCod); void Gam_PutParams (void); void Gam_PutParamGameCod (long GamCod); long Gam_GetParamGameCod (void); @@ -142,8 +143,6 @@ double Gam_GetNumQstsPerCrsGame (Hie_Level_t Scope); void Gam_ShowTstTagsPresentInAGame (long GamCod); -void Gam_SetCurrentGamCod (long GamCod); - void Gam_GetScoreRange (long GamCod,double *MinScore,double *MaxScore); #endif diff --git a/swad_global.c b/swad_global.c index 0d9488e0d..384856c03 100644 --- a/swad_global.c +++ b/swad_global.c @@ -299,7 +299,7 @@ void Gbl_InitializeGlobals (void) Gbl.Prg.LstIsRead = false; // List is not read Gbl.Prg.Num = 0; - Gbl.Prg.LstPrgIteCods = NULL; + Gbl.Prg.LstItmCods = NULL; Gbl.Prg.SelectedOrder = Prg_ORDER_DEFAULT; Gbl.Asgs.LstIsRead = false; // List is not read diff --git a/swad_global.h b/swad_global.h index ca01c8a5f..e0157a37e 100644 --- a/swad_global.h +++ b/swad_global.h @@ -541,10 +541,10 @@ struct Globals struct { bool LstIsRead; // Is the list already read from database, or it needs to be read? - unsigned Num; // Number of schedule items - long *LstPrgIteCods; // List of schedule items codes + unsigned Num; // Number of items + long *LstItmCods; // List of items codes Dat_StartEndTime_t SelectedOrder; - long PrgIteCodToEdit; // Used as parameter in contextual links + // long ItmCodToEdit; // Used as parameter in contextual links unsigned CurrentPage; } Prg; struct diff --git a/swad_group.c b/swad_group.c index c70545d60..9a77c7f88 100644 --- a/swad_group.c +++ b/swad_group.c @@ -42,6 +42,7 @@ #include "swad_match.h" #include "swad_notification.h" #include "swad_parameter.h" +#include "swad_program.h" #include "swad_project.h" #include "swad_setting.h" @@ -1688,9 +1689,12 @@ void Grp_ListGrpsToEditAsgAttSvyMch (struct GroupType *GrpTyp,long Cod, IBelongToThisGroup = Grp_CheckIfGrpIsInList (Grp->GrpCod,&LstGrpsIBelong); AssociatedToGrp = false; - if (Cod > 0) // Cod == -1L means new assignment or survey + if (Cod > 0) // Cod == -1L means new item, assignment, event, survey or match switch (Grp_AsgAttOrSvy) { + case Grp_PROGRAM_ITEM: + AssociatedToGrp = Prg_CheckIfItemIsAssociatedToGrp (Cod,Grp->GrpCod); + break; case Grp_ASSIGNMENT: AssociatedToGrp = Asg_CheckIfAsgIsAssociatedToGrp (Cod,Grp->GrpCod); break; diff --git a/swad_group.h b/swad_group.h index 4290691bc..27e053ef0 100644 --- a/swad_group.h +++ b/swad_group.h @@ -134,6 +134,7 @@ typedef enum typedef enum { + Grp_PROGRAM_ITEM, Grp_ASSIGNMENT, Grp_ATT_EVENT, Grp_SURVEY, diff --git a/swad_program.c b/swad_program.c index 200432fcc..25cc1b447 100644 --- a/swad_program.c +++ b/swad_program.c @@ -39,7 +39,6 @@ #include "swad_global.h" #include "swad_group.h" #include "swad_HTML.h" -#include "swad_notification.h" #include "swad_pagination.h" #include "swad_parameter.h" #include "swad_photo.h" @@ -66,42 +65,61 @@ extern struct Globals Gbl; /***************************** Private variables *****************************/ /*****************************************************************************/ +long Prg_CurrentItmCod; // Used as parameter in contextual links +unsigned Prg_CurrentItmInd; // Used as parameter in contextual links + /*****************************************************************************/ /***************************** Private prototypes ****************************/ /*****************************************************************************/ -static void Prg_ShowAllPrgItems (void); +static void Prg_ShowAllItems (void); static void Prg_PutHeadForSeeing (bool PrintView); -static bool Prg_CheckIfICanCreatePrgItems (void); -static void Prg_PutIconsListPrgItems (void); -static void Prg_PutIconToCreateNewPrgItem (void); -static void Prg_PutButtonToCreateNewPrgItem (void); +static bool Prg_CheckIfICanCreateItems (void); +static void Prg_PutIconsListItems (void); +static void Prg_PutIconToCreateNewItem (void); +static void Prg_PutButtonToCreateNewItem (void); static void Prg_ParamsWhichGroupsToShow (void); -static void Prg_ShowOnePrgItem (long PrgIteCod, - unsigned ItemIndex,unsigned MaxItemIndex, - bool PrintView); -static void Prg_WritePrgItemAuthor (struct ProgramItem *PrgItem); +static void Prg_ShowOneItem (long ItmCod, + unsigned ItmInd,unsigned MaxItmInd, + bool PrintView); +static void Prg_WritePrgItemAuthor (struct ProgramItem *Item); static void Prg_GetParamPrgOrder (void); -static void Prg_PutFormsToRemEditOnePrgItem (const struct ProgramItem *PrgItem, - unsigned ItemIndex,unsigned MaxItemIndex, +static void Prg_PutFormsToRemEditOnePrgItem (const struct ProgramItem *Item, + unsigned ItmInd,unsigned MaxItmInd, const char *Anchor); + +static void Prg_SetCurrentItmCod (long ItmCod); +static long Prg_GetCurrentItmCod (void); +static void Prg_SetCurrentItmInd (unsigned ItmInd); +static unsigned Prg_GetCurrentItmInd (void); static void Prg_PutParams (void); -static void Prg_GetDataOfPrgItem (struct ProgramItem *PrgItem, - MYSQL_RES **mysql_res, - unsigned long NumRows); -static void Prg_ResetPrgItem (struct ProgramItem *PrgItem); -static void Prg_GetPrgItemTxtFromDB (long PrgIteCod,char Txt[Cns_MAX_BYTES_TEXT + 1]); -static void Prg_PutParamPrgItemCod (long PrgIteCod); -static bool Prg_CheckIfSimilarPrgItemExists (const char *Field,const char *Value,long PrgIteCod); -static void Prg_ShowLstGrpsToEditPrgItem (long PrgIteCod); -static void Prg_CreatePrgItem (struct ProgramItem *PrgItem,const char *Txt); -static void Prg_UpdatePrgItem (struct ProgramItem *PrgItem,const char *Txt); -static bool Prg_CheckIfPrgItemIsAssociatedToGrps (long PrgIteCod); -static void Prg_RemoveAllTheGrpsAssociatedToAPrgItem (long PrgIteCod); -static void Prg_CreateGrps (long PrgIteCod); -static void Prg_GetAndWriteNamesOfGrpsAssociatedToPrgItem (struct ProgramItem *PrgItem); -static bool Prg_CheckIfIBelongToCrsOrGrpsThisPrgItem (long PrgIteCod); +static void Prg_PutParamItmInd (unsigned ItmInd); +static unsigned Prg_GetParamItmInd (void); + +static void Prg_GetDataOfItem (struct ProgramItem *Item, + MYSQL_RES **mysql_res, + unsigned long NumRows); +static unsigned Prg_GetItmIndFromStr (const char *UnsignedStr); +static void Prg_ResetItem (struct ProgramItem *Item); +static void Prg_GetPrgItemTxtFromDB (long ItmCod,char Txt[Cns_MAX_BYTES_TEXT + 1]); +static void Prg_PutParamItmCod (long ItmCod); + +static unsigned Prg_GetMaxItemIndex (void); +static unsigned Prg_GetPrevItemIndex (unsigned ItmInd); +static unsigned Prg_GetNextItemIndex (unsigned ItmInd); +static void Prg_ExchangeItems (unsigned ItmIndTop,unsigned ItmIndBottom); +static long Prg_GetItmCodFromItmInd (unsigned ItmInd); + +static bool Prg_CheckIfSimilarPrgItemExists (const char *Field,const char *Value,long ItmCod); +static void Prg_ShowLstGrpsToEditPrgItem (long ItmCod); +static void Prg_CreatePrgItem (struct ProgramItem *Item,const char *Txt); +static void Prg_UpdatePrgItem (struct ProgramItem *Item,const char *Txt); +static bool Prg_CheckIfItemIsAssociatedToGrps (long ItmCod); +static void Prg_RemoveAllTheGrpsAssociatedToAnItem (long ItmCod); +static void Prg_CreateGrps (long ItmCod); +static void Prg_GetAndWriteNamesOfGrpsAssociatedToItem (struct ProgramItem *Item); +static bool Prg_CheckIfIBelongToCrsOrGrpsThisItem (long ItmCod); /*****************************************************************************/ /************************ List all the program items *************************/ @@ -115,14 +133,14 @@ void Prg_SeeCourseProgram (void) Gbl.Prg.CurrentPage = Pag_GetParamPagNum (Pag_COURSE_PROGRAM); /***** Show all the program items *****/ - Prg_ShowAllPrgItems (); + Prg_ShowAllItems (); } /*****************************************************************************/ /*********************** Show all the program items **************************/ /*****************************************************************************/ -static void Prg_ShowAllPrgItems (void) +static void Prg_ShowAllItems (void) { extern const char *Hlp_COURSE_Program; extern const char *Txt_Course_program; @@ -140,7 +158,7 @@ static void Prg_ShowAllPrgItems (void) Gbl.Prg.CurrentPage = (unsigned) Pagination.CurrentPage; /***** Begin box *****/ - Box_BoxBegin ("100%",Txt_Course_program,Prg_PutIconsListPrgItems, + Box_BoxBegin ("100%",Txt_Course_program,Prg_PutIconsListItems, Hlp_COURSE_Program,Box_NOT_CLOSABLE); /***** Select whether show only my groups or all groups *****/ @@ -166,7 +184,7 @@ static void Prg_ShowAllPrgItems (void) for (NumItem = Pagination.FirstItemVisible; NumItem <= Pagination.LastItemVisible; NumItem++) - Prg_ShowOnePrgItem (Gbl.Prg.LstPrgIteCods[NumItem - 1], + Prg_ShowOneItem (Gbl.Prg.LstItmCods[NumItem - 1], NumItem,Gbl.Prg.Num, false); // Not print view @@ -182,14 +200,14 @@ static void Prg_ShowAllPrgItems (void) 0); /***** Button to create a new program item *****/ - if (Prg_CheckIfICanCreatePrgItems ()) - Prg_PutButtonToCreateNewPrgItem (); + if (Prg_CheckIfICanCreateItems ()) + Prg_PutButtonToCreateNewItem (); /***** End box *****/ Box_BoxEnd (); /***** Free list of program items *****/ - Prg_FreeListPrgItems (); + Prg_FreeListItems (); } /*****************************************************************************/ @@ -242,7 +260,7 @@ static void Prg_PutHeadForSeeing (bool PrintView) /******************* Check if I can create program items *********************/ /*****************************************************************************/ -static bool Prg_CheckIfICanCreatePrgItems (void) +static bool Prg_CheckIfICanCreateItems (void) { return (bool) (Gbl.Usrs.Me.Role.Logged == Rol_TCH || Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); @@ -252,11 +270,11 @@ static bool Prg_CheckIfICanCreatePrgItems (void) /************** Put contextual icons in list of program items ****************/ /*****************************************************************************/ -static void Prg_PutIconsListPrgItems (void) +static void Prg_PutIconsListItems (void) { /***** Put icon to create a new program item *****/ - if (Prg_CheckIfICanCreatePrgItems ()) - Prg_PutIconToCreateNewPrgItem (); + if (Prg_CheckIfICanCreateItems ()) + Prg_PutIconToCreateNewItem (); /***** Put icon to show a figure *****/ Gbl.Figures.FigureType = Fig_COURSE_PROGRAMS; @@ -267,12 +285,13 @@ static void Prg_PutIconsListPrgItems (void) /****************** Put icon to create a new program item ********************/ /*****************************************************************************/ -static void Prg_PutIconToCreateNewPrgItem (void) +static void Prg_PutIconToCreateNewItem (void) { extern const char *Txt_New_item; /***** Put form to create a new program item *****/ - Gbl.Prg.PrgIteCodToEdit = -1L; + Prg_SetCurrentItmCod (-1L); + Prg_SetCurrentItmInd (0); Ico_PutContextualIconToAdd (ActFrmNewPrgIte,NULL,Prg_PutParams, Txt_New_item); } @@ -281,11 +300,12 @@ static void Prg_PutIconToCreateNewPrgItem (void) /***************** Put button to create a new program item *******************/ /*****************************************************************************/ -static void Prg_PutButtonToCreateNewPrgItem (void) +static void Prg_PutButtonToCreateNewItem (void) { extern const char *Txt_New_item; - Gbl.Prg.PrgIteCodToEdit = -1L; + Prg_SetCurrentItmCod (-1L); + Prg_SetCurrentItmInd (0); Frm_StartForm (ActFrmNewPrgIte); Prg_PutParams (); Btn_PutConfirmButton (Txt_New_item); @@ -306,23 +326,23 @@ static void Prg_ParamsWhichGroupsToShow (void) /************************** Show one program item ****************************/ /*****************************************************************************/ -static void Prg_ShowOnePrgItem (long PrgIteCod, - unsigned ItemIndex,unsigned MaxItemIndex, - bool PrintView) +static void Prg_ShowOneItem (long ItmCod, + unsigned ItmInd,unsigned MaxItmInd, + bool PrintView) { char *Anchor = NULL; static unsigned UniqueId = 0; char *Id; - struct ProgramItem PrgItem; + struct ProgramItem Item; Dat_StartEndTime_t StartEndTime; char Txt[Cns_MAX_BYTES_TEXT + 1]; /***** Get data of this program item *****/ - PrgItem.PrgIteCod = PrgIteCod; - Prg_GetDataOfPrgItemByCod (&PrgItem); + Item.ItmCod = ItmCod; + Prg_GetDataOfItemByCod (&Item); /***** Set anchor string *****/ - Frm_SetAnchorStr (PrgItem.PrgIteCod,&Anchor); + Frm_SetAnchorStr (Item.ItmCod,&Anchor); /***** Write first row of data of this program item *****/ HTM_TR_Begin (NULL); @@ -333,8 +353,8 @@ static void Prg_ShowOnePrgItem (long PrgIteCod, else { HTM_TD_Begin ("rowspan=\"2\" class=\"CONTEXT_COL COLOR%u\"",Gbl.RowEvenOdd); - Prg_PutFormsToRemEditOnePrgItem (&PrgItem, - ItemIndex,MaxItemIndex, + Prg_PutFormsToRemEditOnePrgItem (&Item, + ItmInd,MaxItmInd, Anchor); } HTM_TD_End (); @@ -342,15 +362,15 @@ static void Prg_ShowOnePrgItem (long PrgIteCod, /* Program item title */ if (PrintView) HTM_TD_Begin ("class=\"%s LT\"", - PrgItem.Hidden ? "ASG_TITLE_LIGHT" : - "ASG_TITLE"); + Item.Hidden ? "ASG_TITLE_LIGHT" : + "ASG_TITLE"); else HTM_TD_Begin ("class=\"%s LT COLOR%u\"", - PrgItem.Hidden ? "ASG_TITLE_LIGHT" : - "ASG_TITLE", + Item.Hidden ? "ASG_TITLE_LIGHT" : + "ASG_TITLE", Gbl.RowEvenOdd); HTM_ARTICLE_Begin (Anchor); - HTM_Txt (PrgItem.Title); + HTM_Txt (Item.Title); HTM_ARTICLE_End (); HTM_TD_End (); @@ -366,19 +386,19 @@ static void Prg_ShowOnePrgItem (long PrgIteCod, if (PrintView) HTM_TD_Begin ("id=\"%s\" class=\"%s LB\"", Id, - PrgItem.Hidden ? (PrgItem.Open ? "DATE_GREEN_LIGHT" : - "DATE_RED_LIGHT") : - (PrgItem.Open ? "DATE_GREEN" : - "DATE_RED")); + Item.Hidden ? (Item.Open ? "DATE_GREEN_LIGHT" : + "DATE_RED_LIGHT") : + (Item.Open ? "DATE_GREEN" : + "DATE_RED")); else HTM_TD_Begin ("id=\"%s\" class=\"%s LB COLOR%u\"", Id, - PrgItem.Hidden ? (PrgItem.Open ? "DATE_GREEN_LIGHT" : - "DATE_RED_LIGHT") : - (PrgItem.Open ? "DATE_GREEN" : - "DATE_RED"), + Item.Hidden ? (Item.Open ? "DATE_GREEN_LIGHT" : + "DATE_RED_LIGHT") : + (Item.Open ? "DATE_GREEN" : + "DATE_RED"), Gbl.RowEvenOdd); - Dat_WriteLocalDateHMSFromUTC (Id,PrgItem.TimeUTC[StartEndTime], + Dat_WriteLocalDateHMSFromUTC (Id,Item.TimeUTC[StartEndTime], Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK, true,true,true,0x7); HTM_TD_End (); @@ -391,7 +411,7 @@ static void Prg_ShowOnePrgItem (long PrgIteCod, HTM_TR_Begin (NULL); /* Text of the program item */ - Prg_GetPrgItemTxtFromDB (PrgItem.PrgIteCod,Txt); + Prg_GetPrgItemTxtFromDB (Item.ItmCod,Txt); Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, Txt,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to recpectful HTML Str_InsertLinks (Txt,Cns_MAX_BYTES_TEXT,60); // Insert links @@ -400,8 +420,8 @@ static void Prg_ShowOnePrgItem (long PrgIteCod, else HTM_TD_Begin ("class=\"LT COLOR%u\"",Gbl.RowEvenOdd); if (Gbl.Crs.Grps.NumGrps) - Prg_GetAndWriteNamesOfGrpsAssociatedToPrgItem (&PrgItem); - HTM_DIV_Begin ("class=\"PAR %s\"",PrgItem.Hidden ? "DAT_LIGHT" : + Prg_GetAndWriteNamesOfGrpsAssociatedToItem (&Item); + HTM_DIV_Begin ("class=\"PAR %s\"",Item.Hidden ? "DAT_LIGHT" : "DAT"); HTM_Txt (Txt); HTM_DIV_End (); @@ -412,7 +432,7 @@ static void Prg_ShowOnePrgItem (long PrgIteCod, HTM_TD_Begin ("colspan=\"2\" class=\"LT\""); else HTM_TD_Begin ("colspan=\"2\" class=\"LT COLOR%u\"",Gbl.RowEvenOdd); - Prg_WritePrgItemAuthor (&PrgItem); + Prg_WritePrgItemAuthor (&Item); HTM_TD_End (); HTM_TR_End (); @@ -421,20 +441,15 @@ static void Prg_ShowOnePrgItem (long PrgIteCod, Frm_FreeAnchorStr (Anchor); Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd; - - /***** Mark possible notification as seen *****/ - Ntf_MarkNotifAsSeen (Ntf_EVENT_ASSIGNMENT, - PrgIteCod,Gbl.Hierarchy.Crs.CrsCod, - Gbl.Usrs.Me.UsrDat.UsrCod); } /*****************************************************************************/ /********************* Write the author of a program item ********************/ /*****************************************************************************/ -static void Prg_WritePrgItemAuthor (struct ProgramItem *PrgItem) +static void Prg_WritePrgItemAuthor (struct ProgramItem *Item) { - Usr_WriteAuthor1Line (PrgItem->UsrCod,PrgItem->Hidden); + Usr_WriteAuthor1Line (Item->UsrCod,Item->Hidden); } /*****************************************************************************/ @@ -463,8 +478,8 @@ void Prg_PutHiddenParamPrgOrder (void) /**************** Put a link (form) to edit one program item *****************/ /*****************************************************************************/ -static void Prg_PutFormsToRemEditOnePrgItem (const struct ProgramItem *PrgItem, - unsigned ItemIndex,unsigned MaxItemIndex, +static void Prg_PutFormsToRemEditOnePrgItem (const struct ProgramItem *Item, + unsigned ItmInd,unsigned MaxItmInd, const char *Anchor) { extern const char *Txt_Move_up_X; @@ -472,12 +487,13 @@ static void Prg_PutFormsToRemEditOnePrgItem (const struct ProgramItem *PrgItem, extern const char *Txt_Movement_not_allowed; char StrItemIndex[Cns_MAX_DECIMAL_DIGITS_UINT + 1]; - Gbl.Prg.PrgIteCodToEdit = PrgItem->PrgIteCod; // Used as parameter in contextual links + Prg_SetCurrentItmCod (Item->ItmCod); // Used as parameter in contextual links + Prg_SetCurrentItmInd (Item->ItmInd); // Used as parameter in contextual links /***** Initialize item index string *****/ snprintf (StrItemIndex,sizeof (StrItemIndex), "%u", - ItemIndex); + ItmInd); switch (Gbl.Usrs.Me.Role.Logged) { @@ -487,15 +503,15 @@ static void Prg_PutFormsToRemEditOnePrgItem (const struct ProgramItem *PrgItem, Ico_PutContextualIconToRemove (ActReqRemPrgIte,Prg_PutParams); /***** Put form to hide/show program item *****/ - if (PrgItem->Hidden) + if (Item->Hidden) Ico_PutContextualIconToUnhide (ActShoPrgIte,Anchor,Prg_PutParams); else Ico_PutContextualIconToHide (ActHidPrgIte,Anchor,Prg_PutParams); - /***** Put icon to move up the question *****/ - if (ItemIndex > 1) + /***** Put icon to move up the item *****/ + if (ItmInd > 1) { - Lay_PutContextualLinkOnlyIcon (ActUp_GamQst,NULL,Prg_PutParams, // TODO: Change action + Lay_PutContextualLinkOnlyIcon (ActUp_PrgIte,NULL,Prg_PutParams, "arrow-up.svg", Str_BuildStringStr (Txt_Move_up_X, StrItemIndex)); @@ -504,10 +520,10 @@ static void Prg_PutFormsToRemEditOnePrgItem (const struct ProgramItem *PrgItem, else Ico_PutIconOff ("arrow-up.svg",Txt_Movement_not_allowed); - /***** Put icon to move down the question *****/ - if (ItemIndex < MaxItemIndex) + /***** Put icon to move down the item *****/ + if (ItmInd < MaxItmInd) { - Lay_PutContextualLinkOnlyIcon (ActDwnGamQst,NULL,Prg_PutParams, // TODO: Change action + Lay_PutContextualLinkOnlyIcon (ActDwnPrgIte,NULL,Prg_PutParams, "arrow-down.svg", Str_BuildStringStr (Txt_Move_down_X, StrItemIndex)); @@ -527,19 +543,72 @@ static void Prg_PutFormsToRemEditOnePrgItem (const struct ProgramItem *PrgItem, } } +/*****************************************************************************/ +/**************** Access to variables used to pass parameter *****************/ +/*****************************************************************************/ + +static void Prg_SetCurrentItmCod (long ItmCod) + { + Prg_CurrentItmCod = ItmCod; + } + +static long Prg_GetCurrentItmCod (void) + { + return Prg_CurrentItmCod; + } + +static void Prg_SetCurrentItmInd (unsigned ItmInd) + { + Prg_CurrentItmInd = ItmInd; + } + +static unsigned Prg_GetCurrentItmInd (void) + { + return Prg_CurrentItmInd; + } + /*****************************************************************************/ /******************** Params used to edit a program item *********************/ /*****************************************************************************/ static void Prg_PutParams (void) { - if (Gbl.Prg.PrgIteCodToEdit > 0) - Prg_PutParamPrgItemCod (Gbl.Prg.PrgIteCodToEdit); + long CurrentItmCod = Prg_GetCurrentItmCod (); + long CurrentItmInd = Prg_GetCurrentItmInd (); + + if (CurrentItmCod > 0) + Prg_PutParamItmCod (CurrentItmCod); + if (CurrentItmInd > 0) + Prg_PutParamItmInd (CurrentItmInd); Prg_PutHiddenParamPrgOrder (); Grp_PutParamWhichGrps (); Pag_PutHiddenParamPagNum (Pag_COURSE_PROGRAM,Gbl.Prg.CurrentPage); } +/*****************************************************************************/ +/******************** Write parameter with index of item *********************/ +/*****************************************************************************/ + +static void Prg_PutParamItmInd (unsigned ItmInd) + { + Par_PutHiddenParamUnsigned (NULL,"ItmInd",ItmInd); + } + +/*****************************************************************************/ +/********************* Get parameter with index of item **********************/ +/*****************************************************************************/ + +static unsigned Prg_GetParamItmInd (void) + { + long ItmInd; + + ItmInd = Par_GetParToLong ("ItmInd"); + if (ItmInd < 0) + Lay_ShowErrorAndExit ("Wrong item index."); + + return (unsigned) ItmInd; + } + /*****************************************************************************/ /*********************** List all the program items **************************/ /*****************************************************************************/ @@ -570,16 +639,16 @@ void Prg_GetListPrgItems (void) unsigned NumAsg; if (Gbl.Prg.LstIsRead) - Prg_FreeListPrgItems (); + Prg_FreeListItems (); /***** Get list of program items from database *****/ if (Gbl.Crs.Grps.WhichGrps == Grp_MY_GROUPS) NumRows = DB_QuerySELECT (&mysql_res,"can not get program items", - "SELECT PrgIteCod" + "SELECT ItmCod" " FROM prg_items" " WHERE CrsCod=%ld%s" - " AND (PrgIteCod NOT IN (SELECT PrgIteCod FROM prg_grp) OR" - " PrgIteCod IN (SELECT prg_grp.PrgIteCod FROM prg_grp,crs_grp_usr" + " AND (ItmCod NOT IN (SELECT ItmCod FROM prg_grp) OR" + " ItmCod IN (SELECT prg_grp.ItmCod FROM prg_grp,crs_grp_usr" " WHERE crs_grp_usr.UsrCod=%ld AND prg_grp.GrpCod=crs_grp_usr.GrpCod))" " ORDER BY %s", Gbl.Hierarchy.Crs.CrsCod, @@ -588,7 +657,7 @@ void Prg_GetListPrgItems (void) OrderBySubQuery[Gbl.Prg.SelectedOrder]); else // Gbl.Crs.Grps.WhichGrps == Grp_ALL_GROUPS NumRows = DB_QuerySELECT (&mysql_res,"can not get program items", - "SELECT PrgIteCod" + "SELECT ItmCod" " FROM prg_items" " WHERE CrsCod=%ld%s" " ORDER BY %s", @@ -596,12 +665,12 @@ void Prg_GetListPrgItems (void) HiddenSubQuery[Gbl.Usrs.Me.Role.Logged], OrderBySubQuery[Gbl.Prg.SelectedOrder]); - if (NumRows) // Assignments found... + if (NumRows) // Items found... { Gbl.Prg.Num = (unsigned) NumRows; /***** Create list of program items *****/ - if ((Gbl.Prg.LstPrgIteCods = (long *) calloc (NumRows,sizeof (long))) == NULL) + if ((Gbl.Prg.LstItmCods = (long *) calloc (NumRows,sizeof (long))) == NULL) Lay_NotEnoughMemoryExit (); /***** Get the program items codes *****/ @@ -611,7 +680,7 @@ void Prg_GetListPrgItems (void) { /* Get next program item code */ row = mysql_fetch_row (mysql_res); - if ((Gbl.Prg.LstPrgIteCods[NumAsg] = Str_ConvertStrCodToLongCod (row[0])) < 0) + if ((Gbl.Prg.LstItmCods[NumAsg] = Str_ConvertStrCodToLongCod (row[0])) < 0) Lay_ShowErrorAndExit ("Error: wrong program item code."); } } @@ -628,113 +697,138 @@ void Prg_GetListPrgItems (void) /****************** Get program item data using its code *********************/ /*****************************************************************************/ -void Prg_GetDataOfPrgItemByCod (struct ProgramItem *PrgItem) +void Prg_GetDataOfItemByCod (struct ProgramItem *Item) { MYSQL_RES *mysql_res; unsigned long NumRows; - if (PrgItem->PrgIteCod > 0) + if (Item->ItmCod > 0) { /***** Build query *****/ NumRows = DB_QuerySELECT (&mysql_res,"can not get program item data", - "SELECT PrgIteCod,Hidden,UsrCod," - "UNIX_TIMESTAMP(StartTime)," - "UNIX_TIMESTAMP(EndTime)," - "NOW() BETWEEN StartTime AND EndTime," - "Title" + "SELECT ItmCod," // row[0] + "ItmInd," // row[1] + "Hidden," // row[2] + "UsrCod," // row[3] + "UNIX_TIMESTAMP(StartTime)," // row[4] + "UNIX_TIMESTAMP(EndTime)," // row[5] + "NOW() BETWEEN StartTime AND EndTime," // row[6] + "Title" // row[7] " FROM prg_items" - " WHERE PrgIteCod=%ld AND CrsCod=%ld", - PrgItem->PrgIteCod,Gbl.Hierarchy.Crs.CrsCod); + " WHERE ItmCod=%ld AND CrsCod=%ld", + Item->ItmCod,Gbl.Hierarchy.Crs.CrsCod); /***** Get data of program item *****/ - Prg_GetDataOfPrgItem (PrgItem,&mysql_res,NumRows); + Prg_GetDataOfItem (Item,&mysql_res,NumRows); } else - { /***** Clear all program item data *****/ - PrgItem->PrgIteCod = -1L; - Prg_ResetPrgItem (PrgItem); - } + Prg_ResetItem (Item); } /*****************************************************************************/ /************************* Get program item data *****************************/ /*****************************************************************************/ -static void Prg_GetDataOfPrgItem (struct ProgramItem *PrgItem, - MYSQL_RES **mysql_res, - unsigned long NumRows) +static void Prg_GetDataOfItem (struct ProgramItem *Item, + MYSQL_RES **mysql_res, + unsigned long NumRows) { MYSQL_ROW row; /***** Clear all program item data *****/ - Prg_ResetPrgItem (PrgItem); + Prg_ResetItem (Item); /***** Get data of program item from database *****/ if (NumRows) // Schedule item found... { /* Get row */ row = mysql_fetch_row (*mysql_res); + /* + ItmCod row[0] + ItmInd row[1] + Hidden row[2] + UsrCod row[3] + UNIX_TIMESTAMP(StartTime) row[4] + UNIX_TIMESTAMP(EndTime) row[5] + NOW() BETWEEN StartTime AND EndTime row[6] + Title row[7] + */ /* Get code of the program item (row[0]) */ - PrgItem->PrgIteCod = Str_ConvertStrCodToLongCod (row[0]); + Item->ItmCod = Str_ConvertStrCodToLongCod (row[0]); - /* Get whether the program item is hidden or not (row[1]) */ - PrgItem->Hidden = (row[1][0] == 'Y'); + /* Get index of the program item (row[1]) */ + Item->ItmInd = Prg_GetItmIndFromStr (row[1]); - /* Get author of the program item (row[2]) */ - PrgItem->UsrCod = Str_ConvertStrCodToLongCod (row[2]); + /* Get whether the program item is hidden or not (row[2]) */ + Item->Hidden = (row[2][0] == 'Y'); - /* Get start date (row[3] holds the start UTC time) */ - PrgItem->TimeUTC[Dat_START_TIME] = Dat_GetUNIXTimeFromStr (row[3]); + /* Get author of the program item (row[3]) */ + Item->UsrCod = Str_ConvertStrCodToLongCod (row[3]); - /* Get end date (row[4] holds the end UTC time) */ - PrgItem->TimeUTC[Dat_END_TIME ] = Dat_GetUNIXTimeFromStr (row[4]); + /* Get start date (row[4] holds the start UTC time) */ + Item->TimeUTC[Dat_START_TIME] = Dat_GetUNIXTimeFromStr (row[4]); - /* Get whether the program item is open or closed (row(5)) */ - PrgItem->Open = (row[5][0] == '1'); + /* Get end date (row[5] holds the end UTC time) */ + Item->TimeUTC[Dat_END_TIME ] = Dat_GetUNIXTimeFromStr (row[5]); - /* Get the title of the program item (row[6]) */ - Str_Copy (PrgItem->Title,row[6], + /* Get whether the program item is open or closed (row(6)) */ + Item->Open = (row[6][0] == '1'); + + /* Get the title of the program item (row[7]) */ + Str_Copy (Item->Title,row[7], Prg_MAX_BYTES_PROGRAM_ITEM_TITLE); /* Can I do this program item? */ - PrgItem->IBelongToCrsOrGrps = Prg_CheckIfIBelongToCrsOrGrpsThisPrgItem (PrgItem->PrgIteCod); + Item->IBelongToCrsOrGrps = Prg_CheckIfIBelongToCrsOrGrpsThisItem (Item->ItmCod); } /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (mysql_res); } +/*****************************************************************************/ +/******************* Get parameter with index of question ********************/ +/*****************************************************************************/ + +static unsigned Prg_GetItmIndFromStr (const char *UnsignedStr) + { + long QstInd; + + QstInd = Str_ConvertStrCodToLongCod (UnsignedStr); + return (QstInd > 0) ? (unsigned) QstInd : + 0; + } + /*****************************************************************************/ /************************ Clear all program item data ************************/ /*****************************************************************************/ -static void Prg_ResetPrgItem (struct ProgramItem *PrgItem) +static void Prg_ResetItem (struct ProgramItem *Item) { - if (PrgItem->PrgIteCod <= 0) // If > 0 ==> keep value - PrgItem->PrgIteCod = -1L; - PrgItem->PrgIteCod = -1L; - PrgItem->Hidden = false; - PrgItem->UsrCod = -1L; - PrgItem->TimeUTC[Dat_START_TIME] = - PrgItem->TimeUTC[Dat_END_TIME ] = (time_t) 0; - PrgItem->Open = false; - PrgItem->Title[0] = '\0'; - PrgItem->IBelongToCrsOrGrps = false; + Item->ItmCod = -1L; + Item->ItmInd = 0; + Item->Hidden = false; + Item->UsrCod = -1L; + Item->TimeUTC[Dat_START_TIME] = + Item->TimeUTC[Dat_END_TIME ] = (time_t) 0; + Item->Open = false; + Item->Title[0] = '\0'; + Item->IBelongToCrsOrGrps = false; } /*****************************************************************************/ /************************ Free list of program items *************************/ /*****************************************************************************/ -void Prg_FreeListPrgItems (void) +void Prg_FreeListItems (void) { - if (Gbl.Prg.LstIsRead && Gbl.Prg.LstPrgIteCods) + if (Gbl.Prg.LstIsRead && Gbl.Prg.LstItmCods) { /***** Free memory used by the list of program items *****/ - free (Gbl.Prg.LstPrgIteCods); - Gbl.Prg.LstPrgIteCods = NULL; + free (Gbl.Prg.LstItmCods); + Gbl.Prg.LstItmCods = NULL; Gbl.Prg.Num = 0; Gbl.Prg.LstIsRead = false; } @@ -744,7 +838,7 @@ void Prg_FreeListPrgItems (void) /******************* Get program item text from database *********************/ /*****************************************************************************/ -static void Prg_GetPrgItemTxtFromDB (long PrgIteCod,char Txt[Cns_MAX_BYTES_TEXT + 1]) +static void Prg_GetPrgItemTxtFromDB (long ItmCod,char Txt[Cns_MAX_BYTES_TEXT + 1]) { MYSQL_RES *mysql_res; MYSQL_ROW row; @@ -753,8 +847,8 @@ static void Prg_GetPrgItemTxtFromDB (long PrgIteCod,char Txt[Cns_MAX_BYTES_TEXT /***** Get text of program item from database *****/ NumRows = DB_QuerySELECT (&mysql_res,"can not get program item text", "SELECT Txt FROM prg_items" - " WHERE PrgIteCod=%ld AND CrsCod=%ld", - PrgIteCod,Gbl.Hierarchy.Crs.CrsCod); + " WHERE ItmCod=%ld AND CrsCod=%ld", + ItmCod,Gbl.Hierarchy.Crs.CrsCod); /***** The result of the query must have one row or none *****/ if (NumRows == 1) @@ -774,70 +868,23 @@ static void Prg_GetPrgItemTxtFromDB (long PrgIteCod,char Txt[Cns_MAX_BYTES_TEXT Lay_ShowErrorAndExit ("Error when getting program item text."); } -/*****************************************************************************/ -/***************** Get summary and content of a program item ****************/ -/*****************************************************************************/ -// This function may be called inside a web service - -void Prg_GetNotifPrgItem (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], - char **ContentStr, - long PrgIteCod,bool GetContent) - { - MYSQL_RES *mysql_res; - MYSQL_ROW row; - unsigned long NumRows; - size_t Length; - - SummaryStr[0] = '\0'; // Return nothing on error - - /***** Build query *****/ - NumRows = DB_QuerySELECT (&mysql_res,"can not get program item title and text", - "SELECT Title,Txt FROM prg_items" - " WHERE PrgIteCod=%ld", - PrgIteCod); - - /***** Result should have a unique row *****/ - if (NumRows == 1) - { - /***** Get row *****/ - row = mysql_fetch_row (mysql_res); - - /***** Get summary *****/ - Str_Copy (SummaryStr,row[0], - Ntf_MAX_BYTES_SUMMARY); - - /***** Get content *****/ - if (GetContent) - { - Length = strlen (row[1]); - if ((*ContentStr = (char *) malloc (Length + 1)) == NULL) - Lay_ShowErrorAndExit ("Error allocating memory for notification content."); - Str_Copy (*ContentStr,row[1], - Length); - } - } - - /***** Free structure that stores the query result *****/ - DB_FreeMySQLResult (&mysql_res); - } - /*****************************************************************************/ /**************** Write parameter with code of program item ******************/ /*****************************************************************************/ -static void Prg_PutParamPrgItemCod (long PrgIteCod) +static void Prg_PutParamItmCod (long ItmCod) { - Par_PutHiddenParamLong (NULL,"PrgIteCod",PrgIteCod); + Par_PutHiddenParamLong (NULL,"ItmCod",ItmCod); } /*****************************************************************************/ /***************** Get parameter with code of program item *******************/ /*****************************************************************************/ -long Prg_GetParamPrgItemCod (void) +long Prg_GetParamItmCod (void) { /***** Get code of program item *****/ - return Par_GetParToLong ("PrgIteCod"); + return Par_GetParToLong ("ItmCod"); } /*****************************************************************************/ @@ -848,7 +895,7 @@ void Prg_ReqRemPrgItem (void) { extern const char *Txt_Do_you_really_want_to_remove_the_item_X; extern const char *Txt_Remove_item; - struct ProgramItem PrgItem; + struct ProgramItem Item; /***** Get parameters *****/ Prg_GetParamPrgOrder (); @@ -856,18 +903,19 @@ void Prg_ReqRemPrgItem (void) Gbl.Prg.CurrentPage = Pag_GetParamPagNum (Pag_COURSE_PROGRAM); /***** Get program item code *****/ - if ((PrgItem.PrgIteCod = Prg_GetParamPrgItemCod ()) == -1L) + if ((Item.ItmCod = Prg_GetParamItmCod ()) == -1L) Lay_ShowErrorAndExit ("Code of program item is missing."); /***** Get data of the program item from database *****/ - Prg_GetDataOfPrgItemByCod (&PrgItem); + Prg_GetDataOfItemByCod (&Item); /***** Show question and button to remove the program item *****/ - Gbl.Prg.PrgIteCodToEdit = PrgItem.PrgIteCod; + Prg_SetCurrentItmCod (Item.ItmCod); + Prg_SetCurrentItmInd (Item.ItmInd); Ale_ShowAlertAndButton (ActRemAsg,NULL,NULL,Prg_PutParams, Btn_REMOVE_BUTTON,Txt_Remove_item, Ale_QUESTION,Txt_Do_you_really_want_to_remove_the_item_X, - PrgItem.Title); + Item.Title); /***** Show program items again *****/ Prg_SeeCourseProgram (); @@ -879,30 +927,26 @@ void Prg_ReqRemPrgItem (void) void Prg_RemovePrgItem (void) { - extern const char *Txt_Assignment_X_removed; - struct ProgramItem PrgItem; + extern const char *Txt_Item_X_removed; + struct ProgramItem Item; /***** Get program item code *****/ - if ((PrgItem.PrgIteCod = Prg_GetParamPrgItemCod ()) == -1L) + if ((Item.ItmCod = Prg_GetParamItmCod ()) == -1L) Lay_ShowErrorAndExit ("Code of program item is missing."); /***** Get data of the program item from database *****/ - Prg_GetDataOfPrgItemByCod (&PrgItem); // Inside this function, the course is checked to be the current one + Prg_GetDataOfItemByCod (&Item); // Inside this function, the course is checked to be the current one /***** Remove all the groups of this program item *****/ - Prg_RemoveAllTheGrpsAssociatedToAPrgItem (PrgItem.PrgIteCod); + Prg_RemoveAllTheGrpsAssociatedToAnItem (Item.ItmCod); /***** Remove program item *****/ DB_QueryDELETE ("can not remove program item", - "DELETE FROM prg_items WHERE PrgIteCod=%ld AND CrsCod=%ld", - PrgItem.PrgIteCod,Gbl.Hierarchy.Crs.CrsCod); - - /***** Mark possible notifications as removed *****/ - Ntf_MarkNotifAsRemoved (Ntf_EVENT_ASSIGNMENT,PrgItem.PrgIteCod); + "DELETE FROM prg_items WHERE ItmCod=%ld AND CrsCod=%ld", + Item.ItmCod,Gbl.Hierarchy.Crs.CrsCod); /***** Write message to show the change made *****/ - Ale_ShowAlert (Ale_SUCCESS,Txt_Assignment_X_removed, - PrgItem.Title); + Ale_ShowAlert (Ale_SUCCESS,Txt_Item_X_removed,Item.Title); /***** Show program items again *****/ Prg_SeeCourseProgram (); @@ -914,20 +958,20 @@ void Prg_RemovePrgItem (void) void Prg_HidePrgItem (void) { - struct ProgramItem PrgItem; + struct ProgramItem Item; /***** Get program item code *****/ - if ((PrgItem.PrgIteCod = Prg_GetParamPrgItemCod ()) == -1L) + if ((Item.ItmCod = Prg_GetParamItmCod ()) == -1L) Lay_ShowErrorAndExit ("Code of program item is missing."); /***** Get data of the program item from database *****/ - Prg_GetDataOfPrgItemByCod (&PrgItem); + Prg_GetDataOfItemByCod (&Item); /***** Hide program item *****/ DB_QueryUPDATE ("can not hide program item", "UPDATE prg_items SET Hidden='Y'" - " WHERE PrgIteCod=%ld AND CrsCod=%ld", - PrgItem.PrgIteCod,Gbl.Hierarchy.Crs.CrsCod); + " WHERE ItmCod=%ld AND CrsCod=%ld", + Item.ItmCod,Gbl.Hierarchy.Crs.CrsCod); /***** Show program items again *****/ Prg_SeeCourseProgram (); @@ -939,38 +983,310 @@ void Prg_HidePrgItem (void) void Prg_ShowPrgItem (void) { - struct ProgramItem PrgItem; + struct ProgramItem Item; /***** Get program item code *****/ - if ((PrgItem.PrgIteCod = Prg_GetParamPrgItemCod ()) == -1L) + if ((Item.ItmCod = Prg_GetParamItmCod ()) == -1L) Lay_ShowErrorAndExit ("Code of program item is missing."); /***** Get data of the program item from database *****/ - Prg_GetDataOfPrgItemByCod (&PrgItem); + Prg_GetDataOfItemByCod (&Item); /***** Hide program item *****/ DB_QueryUPDATE ("can not show program item", "UPDATE prg_items SET Hidden='N'" - " WHERE PrgIteCod=%ld AND CrsCod=%ld", - PrgItem.PrgIteCod,Gbl.Hierarchy.Crs.CrsCod); + " WHERE ItmCod=%ld AND CrsCod=%ld", + Item.ItmCod,Gbl.Hierarchy.Crs.CrsCod); /***** Show program items again *****/ Prg_SeeCourseProgram (); } +/*****************************************************************************/ +/************** Move up position of an item in a course program **************/ +/*****************************************************************************/ + +void Prg_MoveUpPrgItem (void) + { + extern const char *Txt_The_item_has_been_moved_up; + extern const char *Txt_Movement_not_allowed; + struct ProgramItem Item; + unsigned ItmIndTop; + unsigned ItmIndBottom; + + /***** Get program item code *****/ + if ((Item.ItmCod = Prg_GetParamItmCod ()) == -1L) + Lay_ShowErrorAndExit ("Code of program item is missing."); + + /***** Get data of the program item from database *****/ + Prg_GetDataOfItemByCod (&Item); + + /***** Get item index *****/ + ItmIndBottom = Prg_GetParamItmInd (); + + /***** Move up item *****/ + if (ItmIndBottom > 1) + { + /* Indexes of items to be exchanged */ + ItmIndTop = Prg_GetPrevItemIndex (ItmIndBottom); + if (!ItmIndTop) + Lay_ShowErrorAndExit ("Wrong index of item."); + + /* Exchange items */ + Prg_ExchangeItems (ItmIndTop,ItmIndBottom); + + /* Success alert */ + Ale_ShowAlert (Ale_SUCCESS,Txt_The_item_has_been_moved_up); + } + else + Ale_ShowAlert (Ale_WARNING,Txt_Movement_not_allowed); + + /***** Show program items again *****/ + Prg_SeeCourseProgram (); + } + +/*****************************************************************************/ +/************* Move down position of an item in a course program *************/ +/*****************************************************************************/ + +void Prg_MoveDownPrgItem (void) + { + extern const char *Txt_The_item_has_been_moved_down; + extern const char *Txt_Movement_not_allowed; + extern const char *Txt_No_items; + struct ProgramItem Item; + unsigned ItmIndTop; + unsigned ItmIndBottom; + unsigned MaxItmInd; // 0 if no items + + /***** Get program item code *****/ + if ((Item.ItmCod = Prg_GetParamItmCod ()) == -1L) + Lay_ShowErrorAndExit ("Code of program item is missing."); + + /***** Get data of the program item from database *****/ + Prg_GetDataOfItemByCod (&Item); + + /***** Get item index *****/ + ItmIndTop = Prg_GetParamItmInd (); + + /***** Get maximum item index *****/ + MaxItmInd = Prg_GetMaxItemIndex (); + + /***** Move down item *****/ + if (MaxItmInd) + { + if (ItmIndTop < MaxItmInd) + { + /* Indexes of items to be exchanged */ + ItmIndBottom = Prg_GetNextItemIndex (ItmIndTop); + if (!ItmIndBottom) + Lay_ShowErrorAndExit ("Wrong index of item."); + + /* Exchange items */ + Prg_ExchangeItems (ItmIndTop,ItmIndBottom); + + /* Success alert */ + Ale_ShowAlert (Ale_SUCCESS,Txt_The_item_has_been_moved_down); + } + else + Ale_ShowAlert (Ale_WARNING,Txt_Movement_not_allowed); + } + else + Ale_ShowAlert (Ale_WARNING,Txt_No_items); + + /***** Show program items again *****/ + Prg_SeeCourseProgram (); + } + + +/*****************************************************************************/ +/**************** 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 ItmInd = 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",&ItmInd) != 1) + Lay_ShowErrorAndExit ("Error when getting last item index."); + + /***** Free structure that stores the query result *****/ + DB_FreeMySQLResult (&mysql_res); + + return ItmInd; + } + +/*****************************************************************************/ +/*********** Get previous item index to a given index in a course ************/ +/*****************************************************************************/ +// Input item index can be 1, 2, 3... n-1 +// Return item index will be 1, 2, 3... n if previous item exists, or 0 if no previous item + +static unsigned Prg_GetPrevItemIndex (unsigned ItmInd) + { + MYSQL_RES *mysql_res; + MYSQL_ROW row; + unsigned PrevItmInd = 0; + + /***** Get previous item index in a course from database *****/ + // Although indexes are always continuous... + // ...this implementation works even with non continuous indexes + if (!DB_QuerySELECT (&mysql_res,"can not get previous item index", + "SELECT MAX(ItmInd) FROM prg_items" + " WHERE CrsCod=%ld AND ItmInd<%u", + Gbl.Hierarchy.Crs.CrsCod,ItmInd)) + Lay_ShowErrorAndExit ("Error: previous item index not found."); + + /***** Get previous item index (row[0]) *****/ + row = mysql_fetch_row (mysql_res); + if (row) + if (row[0]) + if (sscanf (row[0],"%u",&PrevItmInd) != 1) + Lay_ShowErrorAndExit ("Error when getting previous item index."); + + /***** Free structure that stores the query result *****/ + DB_FreeMySQLResult (&mysql_res); + + return PrevItmInd; + } + +/*****************************************************************************/ +/************** Get next item index to a given index in a course *************/ +/*****************************************************************************/ +// Input item index can be 0, 1, 2, 3... n-1 +// Return item index will be 1, 2, 3... n if next item exists, or 0 if no next item + +static unsigned Prg_GetNextItemIndex (unsigned ItmInd) + { + MYSQL_RES *mysql_res; + MYSQL_ROW row; + unsigned NextItmInd = 0; + + /***** Get next item index in a course from database *****/ + // Although indexes are always continuous... + // ...this implementation works even with non continuous indexes + if (!DB_QuerySELECT (&mysql_res,"can not get next item index", + "SELECT MIN(ItmInd) FROM prg_items" + " WHERE CrsCod=%ld AND ItmInd>%u", + Gbl.Hierarchy.Crs.CrsCod,ItmInd)) + Lay_ShowErrorAndExit ("Error: next item index not found."); + + /***** Get next item index (row[0]) *****/ + row = mysql_fetch_row (mysql_res); + if (row) + if (row[0]) + if (sscanf (row[0],"%u",&NextItmInd) != 1) + Lay_ShowErrorAndExit ("Error when getting next item index."); + + /***** Free structure that stores the query result *****/ + DB_FreeMySQLResult (&mysql_res); + + return NextItmInd; + } + +/*****************************************************************************/ +/****** Exchange the order of two consecutive items in a course program ******/ +/*****************************************************************************/ + +static void Prg_ExchangeItems (unsigned ItmIndTop,unsigned ItmIndBottom) + { + long ItmCodTop; + long ItmCodBottom; + + /***** Lock table to make the move atomic *****/ + DB_Query ("can not lock tables to move program item", + "LOCK TABLES prg_items WRITE"); + Gbl.DB.LockedTables = true; + + /***** Get item codes of the items to be moved *****/ + ItmCodTop = Prg_GetItmCodFromItmInd (ItmIndTop); + ItmCodBottom = Prg_GetItmCodFromItmInd (ItmIndBottom); + + /***** Exchange indexes of items *****/ + /* + Example: + ItmIndTop = 1; ItmCodTop = 218 + ItmIndBottom = 2; ItmCodBottom = 220 + +--------+--------+ +--------+--------+ +--------+--------+ + | ItmInd | ItmCod | | ItmInd | ItmCod | | ItmInd | ItmCod | + +--------+--------+ +--------+--------+ +--------+--------+ + | 1 | 218 | -----> | 2 | 218 | = | 1 | 220 | + | 2 | 220 | | 1 | 220 | | 2 | 218 | + | 3 | 232 | | 3 | 232 | | 3 | 232 | + +--------+--------+ +--------+--------+ +--------+--------+ + */ + DB_QueryUPDATE ("can not exchange indexes of items", + "UPDATE prg_items SET ItmInd=%u" + " WHERE CrsCod=%ld AND ItmCod=%ld", + ItmIndBottom, + Gbl.Hierarchy.Crs.CrsCod,ItmCodTop); + + DB_QueryUPDATE ("can not exchange indexes of items", + "UPDATE prg_items SET ItmInd=%u" + " WHERE CrsCod=%ld AND ItmCod=%ld", + ItmIndTop, + Gbl.Hierarchy.Crs.CrsCod,ItmCodBottom); + + /***** Unlock table *****/ + Gbl.DB.LockedTables = false; // Set to false before the following unlock... + // ...to not retry the unlock if error in unlocking + DB_Query ("can not unlock tables after moving items", + "UNLOCK TABLES"); + } + +/*****************************************************************************/ +/*************** Get item code given course and index of item ****************/ +/*****************************************************************************/ + +static long Prg_GetItmCodFromItmInd (unsigned ItmInd) + { + MYSQL_RES *mysql_res; + MYSQL_ROW row; + long ItmCod; + + /***** Get item code of the item to be moved up *****/ + if (!DB_QuerySELECT (&mysql_res,"can not get item code", + "SELECT QstCod FROM prg_items" + " WHERE CrsCod=%ld AND QstInd=%u", + Gbl.Hierarchy.Crs.CrsCod,ItmInd)) + Lay_ShowErrorAndExit ("Error: wrong item index."); + + /***** Get item code (row[0]) *****/ + row = mysql_fetch_row (mysql_res); + if ((ItmCod = Str_ConvertStrCodToLongCod (row[0])) <= 0) + Lay_ShowErrorAndExit ("Error: wrong item code."); + + /***** Free structure that stores the query result *****/ + DB_FreeMySQLResult (&mysql_res); + + return ItmCod; + } + /*****************************************************************************/ /*************** Check if the title of a program item exists *****************/ /*****************************************************************************/ -static bool Prg_CheckIfSimilarPrgItemExists (const char *Field,const char *Value,long PrgIteCod) +static bool Prg_CheckIfSimilarPrgItemExists (const char *Field,const char *Value,long ItmCod) { /***** Get number of program items with a field value from database *****/ return (DB_QueryCOUNT ("can not get similar program items", "SELECT COUNT(*) FROM prg_items" " WHERE CrsCod=%ld" - " AND %s='%s' AND PrgIteCod<>%ld", + " AND %s='%s' AND ItmCod<>%ld", Gbl.Hierarchy.Crs.CrsCod, - Field,Value,PrgIteCod) != 0); + Field,Value,ItmCod) != 0); } /*****************************************************************************/ @@ -987,8 +1303,8 @@ void Prg_RequestCreatOrEditPrgItem (void) extern const char *Txt_Description; extern const char *Txt_Create_item; extern const char *Txt_Save_changes; - struct ProgramItem PrgItem; - bool ItsANewPrgItem; + struct ProgramItem Item; + bool ItsANewItem; char Txt[Cns_MAX_BYTES_TEXT + 1]; /***** Get parameters *****/ @@ -997,49 +1313,51 @@ void Prg_RequestCreatOrEditPrgItem (void) Gbl.Prg.CurrentPage = Pag_GetParamPagNum (Pag_COURSE_PROGRAM); /***** Get the code of the program item *****/ - ItsANewPrgItem = ((PrgItem.PrgIteCod = Prg_GetParamPrgItemCod ()) == -1L); + ItsANewItem = ((Item.ItmCod = Prg_GetParamItmCod ()) == -1L); /***** Get from the database the data of the program item *****/ - if (ItsANewPrgItem) + if (ItsANewItem) { /* Initialize to empty program item */ - PrgItem.PrgIteCod = -1L; - PrgItem.TimeUTC[Dat_START_TIME] = Gbl.StartExecutionTimeUTC; - PrgItem.TimeUTC[Dat_END_TIME ] = Gbl.StartExecutionTimeUTC + (2 * 60 * 60); // +2 hours - PrgItem.Open = true; - PrgItem.Title[0] = '\0'; - PrgItem.IBelongToCrsOrGrps = false; + Item.ItmCod = -1L; + Item.TimeUTC[Dat_START_TIME] = Gbl.StartExecutionTimeUTC; + Item.TimeUTC[Dat_END_TIME ] = Gbl.StartExecutionTimeUTC + (2 * 60 * 60); // +2 hours + Item.Open = true; + Item.Title[0] = '\0'; + Item.IBelongToCrsOrGrps = false; } else { /* Get data of the program item from database */ - Prg_GetDataOfPrgItemByCod (&PrgItem); + Prg_GetDataOfItemByCod (&Item); /* Get text of the program item from database */ - Prg_GetPrgItemTxtFromDB (PrgItem.PrgIteCod,Txt); + Prg_GetPrgItemTxtFromDB (Item.ItmCod,Txt); } /***** Begin form *****/ - if (ItsANewPrgItem) + if (ItsANewItem) { Frm_StartForm (ActNewPrgIte); - Gbl.Prg.PrgIteCodToEdit = -1L; + Prg_SetCurrentItmCod (-1L); + Prg_SetCurrentItmInd (0); } else { Frm_StartForm (ActChgPrgIte); - Gbl.Prg.PrgIteCodToEdit = PrgItem.PrgIteCod; + Prg_SetCurrentItmCod (Item.ItmCod); + Prg_SetCurrentItmInd (Item.ItmInd); } Prg_PutParams (); /***** Begin box and table *****/ - if (ItsANewPrgItem) + if (ItsANewItem) Box_BoxTableBegin (NULL,Txt_New_item,NULL, Hlp_COURSE_Program_new_item,Box_NOT_CLOSABLE,2); else Box_BoxTableBegin (NULL, - PrgItem.Title[0] ? PrgItem.Title : - Txt_Edit_item, + Item.Title[0] ? Item.Title : + Txt_Edit_item, NULL, Hlp_COURSE_Program_edit_item,Box_NOT_CLOSABLE,2); @@ -1052,7 +1370,7 @@ void Prg_RequestCreatOrEditPrgItem (void) /* Data */ HTM_TD_Begin ("class=\"LM\""); - HTM_INPUT_TEXT ("Title",Prg_MAX_CHARS_PROGRAM_ITEM_TITLE,PrgItem.Title,false, + HTM_INPUT_TEXT ("Title",Prg_MAX_CHARS_PROGRAM_ITEM_TITLE,Item.Title,false, "id=\"Title\" required=\"required\"" " class=\"TITLE_DESCRIPTION_WIDTH\""); HTM_TD_End (); @@ -1060,7 +1378,7 @@ void Prg_RequestCreatOrEditPrgItem (void) HTM_TR_End (); /***** Schedule item start and end dates *****/ - Dat_PutFormStartEndClientLocalDateTimes (PrgItem.TimeUTC,Dat_FORM_SECONDS_ON); + Dat_PutFormStartEndClientLocalDateTimes (Item.TimeUTC,Dat_FORM_SECONDS_ON); /***** Schedule item text *****/ HTM_TR_Begin (NULL); @@ -1072,7 +1390,7 @@ void Prg_RequestCreatOrEditPrgItem (void) HTM_TD_Begin ("class=\"LT\""); HTM_TEXTAREA_Begin ("id=\"Txt\" name=\"Txt\" rows=\"10\"" " class=\"TITLE_DESCRIPTION_WIDTH\""); - if (!ItsANewPrgItem) + if (!ItsANewItem) HTM_Txt (Txt); HTM_TEXTAREA_End (); HTM_TD_End (); @@ -1080,10 +1398,10 @@ void Prg_RequestCreatOrEditPrgItem (void) HTM_TR_End (); /***** Groups *****/ - Prg_ShowLstGrpsToEditPrgItem (PrgItem.PrgIteCod); + Prg_ShowLstGrpsToEditPrgItem (Item.ItmCod); /***** End table, send button and end box *****/ - if (ItsANewPrgItem) + if (ItsANewItem) Box_BoxTableWithButtonEnd (Btn_CREATE_BUTTON,Txt_Create_item); else Box_BoxTableWithButtonEnd (Btn_CONFIRM_BUTTON,Txt_Save_changes); @@ -1092,14 +1410,14 @@ void Prg_RequestCreatOrEditPrgItem (void) Frm_EndForm (); /***** Show current program items, if any *****/ - Prg_ShowAllPrgItems (); + Prg_ShowAllItems (); } /*****************************************************************************/ /*************** Show list of groups to edit and program item ****************/ /*****************************************************************************/ -static void Prg_ShowLstGrpsToEditPrgItem (long PrgIteCod) +static void Prg_ShowLstGrpsToEditPrgItem (long ItmCod) { extern const char *Hlp_USERS_Groups; extern const char *The_ClassFormInBox[The_NUM_THEMES]; @@ -1131,7 +1449,7 @@ static void Prg_ShowLstGrpsToEditPrgItem (long PrgIteCod) HTM_INPUT_CHECKBOX ("WholeCrs",false, "id=\"WholeCrs\" value=\"Y\"%s" " onclick=\"uncheckChildren(this,'GrpCods')\"", - Prg_CheckIfPrgItemIsAssociatedToGrps (PrgIteCod) ? "" : + Prg_CheckIfItemIsAssociatedToGrps (ItmCod) ? "" : " checked=\"checked\""); HTM_TxtF ("%s %s",Txt_The_whole_course,Gbl.Hierarchy.Crs.ShrtName); HTM_LABEL_End (); @@ -1145,7 +1463,7 @@ static void Prg_ShowLstGrpsToEditPrgItem (long PrgIteCod) NumGrpTyp++) if (Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].NumGrps) Grp_ListGrpsToEditAsgAttSvyMch (&Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp], - PrgIteCod,Grp_ASSIGNMENT); + ItmCod,Grp_PROGRAM_ITEM); /***** End table and box *****/ Box_BoxTableEnd (); @@ -1168,80 +1486,77 @@ void Prg_RecFormPrgItem (void) 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 OldPrgItem; // Current program item data in database - struct ProgramItem NewPrgItem; // Schedule item data received from form - bool ItsANewPrgItem; - bool NewPrgItemIsCorrect = true; + struct ProgramItem OldItem; // Current program item data in database + struct ProgramItem NewItem; // Schedule item data received from form + bool ItsANewItem; + bool NewItemIsCorrect = true; char Description[Cns_MAX_BYTES_TEXT + 1]; /***** Get the code of the program item *****/ - NewPrgItem.PrgIteCod = Prg_GetParamPrgItemCod (); - ItsANewPrgItem = (NewPrgItem.PrgIteCod < 0); + NewItem.ItmCod = Prg_GetParamItmCod (); + ItsANewItem = (NewItem.ItmCod < 0); - if (ItsANewPrgItem) - { + if (ItsANewItem) /***** Reset old (current, not existing) program item data *****/ - OldPrgItem.PrgIteCod = -1L; - Prg_ResetPrgItem (&OldPrgItem); - } + Prg_ResetItem (&OldItem); else { /***** Get data of the old (current) program item from database *****/ - OldPrgItem.PrgIteCod = NewPrgItem.PrgIteCod; - Prg_GetDataOfPrgItemByCod (&OldPrgItem); + OldItem.ItmCod = NewItem.ItmCod; + Prg_GetDataOfItemByCod (&OldItem); } /***** Get start/end date-times *****/ - NewPrgItem.TimeUTC[Dat_START_TIME] = Dat_GetTimeUTCFromForm ("StartTimeUTC"); - NewPrgItem.TimeUTC[Dat_END_TIME ] = Dat_GetTimeUTCFromForm ("EndTimeUTC" ); + NewItem.TimeUTC[Dat_START_TIME] = Dat_GetTimeUTCFromForm ("StartTimeUTC"); + NewItem.TimeUTC[Dat_END_TIME ] = Dat_GetTimeUTCFromForm ("EndTimeUTC" ); /***** Get program item title *****/ - Par_GetParToText ("Title",NewPrgItem.Title,Prg_MAX_BYTES_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 (NewPrgItem.TimeUTC[Dat_START_TIME] == 0) - NewPrgItem.TimeUTC[Dat_START_TIME] = Gbl.StartExecutionTimeUTC; - if (NewPrgItem.TimeUTC[Dat_END_TIME] == 0) - NewPrgItem.TimeUTC[Dat_END_TIME] = NewPrgItem.TimeUTC[Dat_START_TIME] + 2 * 60 * 60; // +2 hours + 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 (NewPrgItem.Title[0]) // If there's a program item title + if (NewItem.Title[0]) // If there's a program item title { /* If title of program item was in database... */ - if (Prg_CheckIfSimilarPrgItemExists ("Title",NewPrgItem.Title,NewPrgItem.PrgIteCod)) + if (Prg_CheckIfSimilarPrgItemExists ("Title",NewItem.Title,NewItem.ItmCod)) { - NewPrgItemIsCorrect = false; + NewItemIsCorrect = false; Ale_ShowAlert (Ale_WARNING,Txt_Already_existed_an_item_with_the_title_X, - NewPrgItem.Title); + NewItem.Title); } } else // If there is not a program item title { - NewPrgItemIsCorrect = false; + NewItemIsCorrect = false; Ale_ShowAlert (Ale_WARNING,Txt_You_must_specify_the_title_of_the_item); } /***** Create a new program item or update an existing one *****/ - if (NewPrgItemIsCorrect) + if (NewItemIsCorrect) { /* Get groups for this program items */ Grp_GetParCodsSeveralGrps (); - if (ItsANewPrgItem) + if (ItsANewItem) { - Prg_CreatePrgItem (&NewPrgItem,Description); // Add new program item to database + Prg_CreatePrgItem (&NewItem,Description); // Add new program item to database /***** Write success message *****/ Ale_ShowAlert (Ale_SUCCESS,Txt_Created_new_item_X, - NewPrgItem.Title); + NewItem.Title); } else { - Prg_UpdatePrgItem (&NewPrgItem,Description); + Prg_UpdatePrgItem (&NewItem,Description); /***** Write success message *****/ Ale_ShowAlert (Ale_SUCCESS,Txt_The_item_has_been_modified); @@ -1262,10 +1577,10 @@ void Prg_RecFormPrgItem (void) /************************ Create a new program item **************************/ /*****************************************************************************/ -static void Prg_CreatePrgItem (struct ProgramItem *PrgItem,const char *Txt) +static void Prg_CreatePrgItem (struct ProgramItem *Item,const char *Txt) { /***** Create a new program item *****/ - PrgItem->PrgIteCod = + Item->ItmCod = DB_QueryINSERTandReturnCode ("can not create new program item", "INSERT INTO prg_items" " (CrsCod,UsrCod,StartTime,EndTime,Title,Txt)" @@ -1274,21 +1589,21 @@ static void Prg_CreatePrgItem (struct ProgramItem *PrgItem,const char *Txt) "'%s','%s')", Gbl.Hierarchy.Crs.CrsCod, Gbl.Usrs.Me.UsrDat.UsrCod, - PrgItem->TimeUTC[Dat_START_TIME], - PrgItem->TimeUTC[Dat_END_TIME ], - PrgItem->Title, + Item->TimeUTC[Dat_START_TIME], + Item->TimeUTC[Dat_END_TIME ], + Item->Title, Txt); /***** Create groups *****/ if (Gbl.Crs.Grps.LstGrpsSel.NumGrps) - Prg_CreateGrps (PrgItem->PrgIteCod); + Prg_CreateGrps (Item->ItmCod); } /*****************************************************************************/ /******************** Update an existing program item ************************/ /*****************************************************************************/ -static void Prg_UpdatePrgItem (struct ProgramItem *PrgItem,const char *Txt) +static void Prg_UpdatePrgItem (struct ProgramItem *Item,const char *Txt) { /***** Update the data of the program item *****/ DB_QueryUPDATE ("can not update program item", @@ -1296,59 +1611,59 @@ static void Prg_UpdatePrgItem (struct ProgramItem *PrgItem,const char *Txt) "StartTime=FROM_UNIXTIME(%ld)," "EndTime=FROM_UNIXTIME(%ld)," "Title='%s',Txt='%s'" - " WHERE PrgIteCod=%ld AND CrsCod=%ld", - PrgItem->TimeUTC[Dat_START_TIME], - PrgItem->TimeUTC[Dat_END_TIME ], - PrgItem->Title, + " WHERE ItmCod=%ld AND CrsCod=%ld", + Item->TimeUTC[Dat_START_TIME], + Item->TimeUTC[Dat_END_TIME ], + Item->Title, Txt, - PrgItem->PrgIteCod,Gbl.Hierarchy.Crs.CrsCod); + Item->ItmCod,Gbl.Hierarchy.Crs.CrsCod); /***** Update groups *****/ /* Remove old groups */ - Prg_RemoveAllTheGrpsAssociatedToAPrgItem (PrgItem->PrgIteCod); + Prg_RemoveAllTheGrpsAssociatedToAnItem (Item->ItmCod); /* Create new groups */ if (Gbl.Crs.Grps.LstGrpsSel.NumGrps) - Prg_CreateGrps (PrgItem->PrgIteCod); + Prg_CreateGrps (Item->ItmCod); } /*****************************************************************************/ /*********** Check if a program item is associated to any group **************/ /*****************************************************************************/ -static bool Prg_CheckIfPrgItemIsAssociatedToGrps (long PrgIteCod) +static bool Prg_CheckIfItemIsAssociatedToGrps (long ItmCod) { /***** Get if a program item is associated to a group from database *****/ return (DB_QueryCOUNT ("can not check if a program item" " is associated to groups", - "SELECT COUNT(*) FROM prg_grp WHERE PrgIteCod=%ld", - PrgIteCod) != 0); + "SELECT COUNT(*) FROM prg_grp WHERE ItmCod=%ld", + ItmCod) != 0); } /*****************************************************************************/ /************ Check if a program item is associated to a group ***************/ /*****************************************************************************/ -bool Prg_CheckIfPrgItemIsAssociatedToGrp (long PrgIteCod,long GrpCod) +bool Prg_CheckIfItemIsAssociatedToGrp (long ItmCod,long GrpCod) { /***** Get if a program item is associated to a group from database *****/ return (DB_QueryCOUNT ("can not check if a program item" " is associated to a group", "SELECT COUNT(*) FROM prg_grp" - " WHERE PrgIteCod=%ld AND GrpCod=%ld", - PrgIteCod,GrpCod) != 0); + " WHERE ItmCod=%ld AND GrpCod=%ld", + ItmCod,GrpCod) != 0); } /*****************************************************************************/ /********************* Remove groups of a program item ***********************/ /*****************************************************************************/ -static void Prg_RemoveAllTheGrpsAssociatedToAPrgItem (long PrgIteCod) +static void Prg_RemoveAllTheGrpsAssociatedToAnItem (long ItmCod) { /***** Remove groups of the program item *****/ DB_QueryDELETE ("can not remove the groups associated to a program item", - "DELETE FROM prg_grp WHERE PrgIteCod=%ld", - PrgIteCod); + "DELETE FROM prg_grp WHERE ItmCod=%ld", + ItmCod); } /*****************************************************************************/ @@ -1383,7 +1698,7 @@ void Prg_RemoveGroupsOfType (long GrpTypCod) /********************* Create groups of a program item ***********************/ /*****************************************************************************/ -static void Prg_CreateGrps (long PrgIteCod) +static void Prg_CreateGrps (long ItmCod) { unsigned NumGrpSel; @@ -1394,10 +1709,10 @@ static void Prg_CreateGrps (long PrgIteCod) /* Create group */ DB_QueryINSERT ("can not associate a group to a program item", "INSERT INTO prg_grp" - " (PrgIteCod,GrpCod)" + " (ItmCod,GrpCod)" " VALUES" " (%ld,%ld)", - PrgIteCod, + ItmCod, Gbl.Crs.Grps.LstGrpsSel.GrpCods[NumGrpSel]); } @@ -1405,7 +1720,7 @@ static void Prg_CreateGrps (long PrgIteCod) /********* Get and write the names of the groups of a program item ***********/ /*****************************************************************************/ -static void Prg_GetAndWriteNamesOfGrpsAssociatedToPrgItem (struct ProgramItem *PrgItem) +static void Prg_GetAndWriteNamesOfGrpsAssociatedToItem (struct ProgramItem *Item) { extern const char *Txt_Group; extern const char *Txt_Groups; @@ -1420,15 +1735,15 @@ static void Prg_GetAndWriteNamesOfGrpsAssociatedToPrgItem (struct ProgramItem *P NumRows = DB_QuerySELECT (&mysql_res,"can not get groups of a program item", "SELECT crs_grp_types.GrpTypName,crs_grp.GrpName" " FROM prg_grp,crs_grp,crs_grp_types" - " WHERE prg_grp.PrgIteCod=%ld" + " WHERE prg_grp.ItmCod=%ld" " AND prg_grp.GrpCod=crs_grp.GrpCod" " AND crs_grp.GrpTypCod=crs_grp_types.GrpTypCod" " ORDER BY crs_grp_types.GrpTypName,crs_grp.GrpName", - PrgItem->PrgIteCod); + Item->ItmCod); /***** Write heading *****/ - HTM_DIV_Begin ("class=\"%s\"",PrgItem->Hidden ? "ASG_GRP_LIGHT" : - "ASG_GRP"); + HTM_DIV_Begin ("class=\"%s\"",Item->Hidden ? "ASG_GRP_LIGHT" : + "ASG_GRP"); HTM_TxtColonNBSP (NumRows == 1 ? Txt_Group : Txt_Groups); @@ -1469,14 +1784,14 @@ static void Prg_GetAndWriteNamesOfGrpsAssociatedToPrgItem (struct ProgramItem *P /***************** Remove all the program items of a course ******************/ /*****************************************************************************/ -void Prg_RemoveCrsPrgItems (long CrsCod) +void Prg_RemoveCrsItems (long CrsCod) { /***** Remove groups *****/ DB_QueryDELETE ("can not remove all the groups associated" " to program items of a course", "DELETE FROM prg_grp USING prg_items,prg_grp" " WHERE prg_items.CrsCod=%ld" - " AND prg_items.PrgIteCod=prg_grp.PrgIteCod", + " AND prg_items.ItmCod=prg_grp.ItmCod", CrsCod); /***** Remove program items *****/ @@ -1489,7 +1804,7 @@ void Prg_RemoveCrsPrgItems (long CrsCod) /******** Check if I belong to any of the groups of a program item ***********/ /*****************************************************************************/ -static bool Prg_CheckIfIBelongToCrsOrGrpsThisPrgItem (long PrgIteCod) +static bool Prg_CheckIfIBelongToCrsOrGrpsThisItem (long ItmCod) { switch (Gbl.Usrs.Me.Role.Logged) { @@ -1500,19 +1815,19 @@ static bool Prg_CheckIfIBelongToCrsOrGrpsThisPrgItem (long PrgIteCod) /***** Get if I can do a program item from database *****/ return (DB_QueryCOUNT ("can not check if I can do a program item", "SELECT COUNT(*) FROM prg_items" - " WHERE PrgIteCod=%ld" + " WHERE ItmCod=%ld" " AND " "(" // Schedule item is for the whole course - "PrgIteCod NOT IN (SELECT PrgIteCod FROM prg_grp)" + "ItmCod NOT IN (SELECT ItmCod FROM prg_grp)" " OR " // Schedule item is for specific groups - "PrgIteCod IN" - " (SELECT prg_grp.PrgIteCod FROM prg_grp,crs_grp_usr" + "ItmCod IN" + " (SELECT prg_grp.ItmCod FROM prg_grp,crs_grp_usr" " WHERE crs_grp_usr.UsrCod=%ld" " AND prg_grp.GrpCod=crs_grp_usr.GrpCod)" ")", - PrgIteCod,Gbl.Usrs.Me.UsrDat.UsrCod) != 0); + ItmCod,Gbl.Usrs.Me.UsrDat.UsrCod) != 0); case Rol_SYS_ADM: return true; default: @@ -1521,14 +1836,14 @@ static bool Prg_CheckIfIBelongToCrsOrGrpsThisPrgItem (long PrgIteCod) } /*****************************************************************************/ -/***************** Get number of program items in a course *******************/ +/***************** Get number of items in a course program *******************/ /*****************************************************************************/ -unsigned Prg_GetNumPrgItemsInCrs (long CrsCod) +unsigned Prg_GetNumItemsInCrsProgram (long CrsCod) { - /***** Get number of program items in a course from database *****/ + /***** Get number of items in a course program from database *****/ return - (unsigned) DB_QueryCOUNT ("can not get number of program items in course", + (unsigned) DB_QueryCOUNT ("can not get number of items in course program", "SELECT COUNT(*) FROM prg_items" " WHERE CrsCod=%ld", CrsCod); @@ -1540,7 +1855,7 @@ unsigned Prg_GetNumPrgItemsInCrs (long CrsCod) // Returns the number of courses with program items // in this location (all the platform, current degree or current course) -unsigned Prg_GetNumCoursesWithPrgItems (Hie_Level_t Scope) +unsigned Prg_GetNumCoursesWithItems (Hie_Level_t Scope) { MYSQL_RES *mysql_res; MYSQL_ROW row; @@ -1625,11 +1940,11 @@ unsigned Prg_GetNumCoursesWithPrgItems (Hie_Level_t Scope) /*****************************************************************************/ // Returns the number of program items in a hierarchy scope -unsigned Prg_GetNumPrgItems (Hie_Level_t Scope) +unsigned Prg_GetNumItems (Hie_Level_t Scope) { MYSQL_RES *mysql_res; MYSQL_ROW row; - unsigned NumPrgItems; + unsigned NumItems; /***** Get number of program items from database *****/ switch (Scope) @@ -1692,11 +2007,11 @@ unsigned Prg_GetNumPrgItems (Hie_Level_t Scope) /***** Get number of program items *****/ row = mysql_fetch_row (mysql_res); - if (sscanf (row[0],"%u",&NumPrgItems) != 1) + if (sscanf (row[0],"%u",&NumItems) != 1) Lay_ShowErrorAndExit ("Error when getting number of program items."); /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); - return NumPrgItems; + return NumItems; } diff --git a/swad_program.h b/swad_program.h index 21d769e5a..b9747ed20 100644 --- a/swad_program.h +++ b/swad_program.h @@ -41,7 +41,8 @@ struct ProgramItem { - long PrgIteCod; + long ItmCod; + unsigned ItmInd; bool Hidden; long UsrCod; time_t TimeUTC[Dat_NUM_START_END_TIME]; @@ -64,26 +65,24 @@ void Prg_SeeCourseProgram (void); void Prg_PutHiddenParamPrgOrder (void); void Prg_RequestCreatOrEditPrgItem (void); void Prg_GetListPrgItems (void); -void Prg_GetDataOfPrgItemByCod (struct ProgramItem *PrgItem); -void Prg_FreeListPrgItems (void); +void Prg_GetDataOfItemByCod (struct ProgramItem *PrgItem); +void Prg_FreeListItems (void); -void Prg_GetNotifPrgItem (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], - char **ContentStr, - long PrgIteCod,bool GetContent); - -long Prg_GetParamPrgItemCod (void); +long Prg_GetParamItemCode (void); void Prg_ReqRemPrgItem (void); void Prg_RemovePrgItem (void); void Prg_HidePrgItem (void); void Prg_ShowPrgItem (void); +void Prg_MoveUpPrgItem (void); +void Prg_MoveDownPrgItem (void); void Prg_RecFormPrgItem (void); -bool Prg_CheckIfPrgItemIsAssociatedToGrp (long PrgIteCod,long GrpCod); +bool Prg_CheckIfItemIsAssociatedToGrp (long PrgIteCod,long GrpCod); void Prg_RemoveGroup (long GrpCod); void Prg_RemoveGroupsOfType (long GrpTypCod); -void Prg_RemoveCrsPrgItems (long CrsCod); -unsigned Prg_GetNumPrgItemsInCrs(long CrsCod); +void Prg_RemoveCrsItems (long CrsCod); +unsigned Prg_GetNumItemsInCrsProgram(long CrsCod); -unsigned Prg_GetNumCoursesWithPrgItems (Hie_Level_t Scope); -unsigned Prg_GetNumPrgItems (Hie_Level_t Scope); +unsigned Prg_GetNumCoursesWithItems (Hie_Level_t Scope); +unsigned Prg_GetNumItems (Hie_Level_t Scope); #endif diff --git a/swad_text.c b/swad_text.c index 8eb158e8b..9a1c1ebb3 100644 --- a/swad_text.c +++ b/swad_text.c @@ -17234,23 +17234,44 @@ const char *Txt_Item = #if L==1 // ca "Ítem"; #elif L==2 // de - "Artikel"; + "Programmelement"; #elif L==3 // en "Item"; #elif L==4 // es "Ítem"; #elif L==5 // fr - "Article"; + "Élément"; #elif L==6 // gn "Ítem"; // Okoteve traducción #elif L==7 // it - "Articolo"; + "Elemento"; #elif L==8 // pl "Pozycja"; #elif L==9 // pt "Item"; #endif +const char *Txt_Item_X_removed = // Warning: it is very important to include %s in the following sentences +#if L==1 // ca + "Ítem %s eliminat."; +#elif L==2 // de + "Programmelement %s entfernt."; +#elif L==3 // en + "Item s removed."; +#elif L==4 // es + "Ítem %s eliminado."; +#elif L==5 // fr + "Élément %s supprimé."; +#elif L==6 // gn + "Ítem %s eliminado."; // Okoteve traducción +#elif L==7 // it + "Elemento %s rimosso."; +#elif L==8 // pl + "Pozycja %s usuniete."; +#elif L==9 // pt + "Item %s removido."; +#endif + const char *Txt_Its_me = #if L==1 // ca "Sóc jo!"; @@ -47757,6 +47778,48 @@ const char *Txt_The_properties_of_file_X_have_been_saved = // Warning: it is ver "As propriedades do arquivo %s foram salvas."; #endif +const char *Txt_The_item_has_been_moved_down = +#if L==1 // ca + "El ítem ha estat moguda cap avall."; +#elif L==2 // de + "Der Programmelement wurde nach unten bewegt."; +#elif L==3 // en + "The item has been moved down."; +#elif L==4 // es + "El ítem se ha movido hacia abajo."; +#elif L==5 // fr + "L'élément a été déplacé vers le bas."; +#elif L==6 // gn + "El ítem se ha movido hacia abajo."; // Okoteve traducción +#elif L==7 // it + "Il elemento è stato abbattuto."; +#elif L==8 // pl + "Pozycja zostało przeniesione."; +#elif L==9 // pt + "O item foi movido para baixo."; +#endif + +const char *Txt_The_item_has_been_moved_up = +#if L==1 // ca + "El ítem ha estat moguda cap amunt."; +#elif L==2 // de + "Der Programmelement wurde nach oben verschoben."; +#elif L==3 // en + "The item has been moved up."; +#elif L==4 // es + "El ítem se ha movido hacia arriba."; +#elif L==5 // fr + "L'élément a été déplacé vers le haut."; +#elif L==6 // gn + "El ítem se ha movido hacia arriba."; // Okoteve traducción +#elif L==7 // it + "Il elemento è stato spostato."; +#elif L==8 // pl + "Pozycja zostało poruszone."; +#elif L==9 // pt + "O item foi movido para cima."; +#endif + const char *Txt_The_question_has_been_moved_down = #if L==1 // ca "La pregunta ha estat moguda cap avall."; @@ -47769,7 +47832,7 @@ const char *Txt_The_question_has_been_moved_down = #elif L==5 // fr "La question a été déplacée vers le bas."; #elif L==6 // gn - "La pregunta se ha movido hacia arriba."; // Okoteve traducción + "La pregunta se ha movido hacia abajo."; // Okoteve traducción #elif L==7 // it "La questione è stata abbattuta."; #elif L==8 // pl diff --git a/swad_text_action.c b/swad_text_action.c index 932770a6c..5e33bf2f4 100644 --- a/swad_text_action.c +++ b/swad_text_action.c @@ -4953,6 +4953,48 @@ const char *Txt_Actions[Act_NUM_ACTIONS] = "" // Potrzebujesz tlumaczenie #elif L==9 // pt "" // Precisa de tradução +#endif + , + [ActUp_PrgIte] = +#if L==1 // ca + "" // Necessita traducció +#elif L==2 // de + "" // Need Übersetzung +#elif L==3 // en + "Move up program item" +#elif L==4 // es + "Subir ítem del programa" +#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 + , + [ActDwnPrgIte] = +#if L==1 // ca + "" // Necessita traducció +#elif L==2 // de + "" // Need Übersetzung +#elif L==3 // en + "Move down program item" +#elif L==4 // es + "Bajar ítem del programa" +#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 , [ActSeeTchGui] = @@ -5444,7 +5486,7 @@ const char *Txt_Actions[Act_NUM_ACTIONS] = #elif L==2 // de "" // Need Übersetzung #elif L==3 // en - "Bajar the posición of a subtree of the syllabus of practicals" + "Bajar the position of a subtree of the syllabus of practicals" #elif L==4 // es "" #elif L==5 // fr