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