diff --git a/Makefile b/Makefile
index a1a9761e..efe63815 100644
--- a/Makefile
+++ b/Makefile
@@ -74,7 +74,7 @@ OBJS = swad_account.o swad_account_database.o swad_action.o swad_admin.o \
swad_photo_shape.o swad_place.o swad_place_database.o swad_plugin.o \
swad_plugin_database.o swad_privacy.o swad_profile.o \
swad_profile_database.o swad_program.o swad_program_database.o \
- swad_project.o swad_project_database.o \
+ swad_program_resource.o swad_project.o swad_project_database.o \
swad_question.o swad_question_database.o swad_question_import.o \
swad_QR.o \
swad_record.o swad_record_database.o swad_report.o \
diff --git a/sql/cambios.sql b/sql/cambios.sql
index 15370955..2f52cd71 100644
--- a/sql/cambios.sql
+++ b/sql/cambios.sql
@@ -13605,6 +13605,11 @@ ALTER TABLE usr_data ADD COLUMN PhotoShape TINYINT NOT NULL DEFAULT 0 AFTER Side
UPDATE usr_data SET PhotoShape=3;
+-----------------
+
+INSERT INTO prg_resources (ItmCod,RscInd,Hidden,Title) VALUES (14,0,'N','Recurso 1');
+INSERT INTO prg_resources (ItmCod,RscInd,Hidden,Title) VALUES (14,1,'N','Recurso 2');
+INSERT INTO prg_resources (ItmCod,RscInd,Hidden,Title) VALUES (14,2,'N','Recurso 3');
diff --git a/sql/swad.sql b/sql/swad.sql
index 88e77d29..773a108b 100644
--- a/sql/swad.sql
+++ b/sql/swad.sql
@@ -1178,6 +1178,17 @@ CREATE TABLE IF NOT EXISTS prg_items (
UNIQUE INDEX(ItmCod),
UNIQUE INDEX(CrsCod,ItmInd));
--
+-- Table prg_resources: stores the resources of the course program
+--
+CREATE TABLE IF NOT EXISTS prg_resources (
+ RscCod INT NOT NULL AUTO_INCREMENT,
+ ItmCod INT NOT NULL DEFAULT -1,
+ RscInd INT NOT NULL DEFAULT 0,
+ Hidden ENUM('N','Y') NOT NULL DEFAULT 'N',
+ Title VARCHAR(2047) NOT NULL,
+ UNIQUE INDEX(RscCod),
+ UNIQUE INDEX(ItmCod,RscInd));
+--
-- Table prj_config: stores the configuration of projects for each course
--
CREATE TABLE IF NOT EXISTS prj_config (
diff --git a/swad_action.c b/swad_action.c
index 897b9e0b..71dbeaae 100644
--- a/swad_action.c
+++ b/swad_action.c
@@ -86,6 +86,7 @@
#include "swad_privacy.h"
#include "swad_profile.h"
#include "swad_program.h"
+#include "swad_program_resource.h"
#include "swad_project.h"
#include "swad_question_import.h"
#include "swad_QR.h"
@@ -441,6 +442,8 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
[ActLftPrgItm ] = {1834,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_MoveLeftItem ,NULL},
[ActRgtPrgItm ] = {1833,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_MoveRightItem ,NULL},
+ [ActFrmNewPrgRsc ] = {1918,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RequestChangeItem ,NULL},
+
[ActEdiTchGui ] = { 785,-1,TabUnk,ActSeeTchGui ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Inf_FormsToSelSendInfo ,NULL},
[ActSeeSylLec ] = { 28,-1,TabUnk,ActSeeSyl ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Inf_ShowInfo ,NULL},
@@ -3743,6 +3746,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
-1, // #1915 (obsolete action)
-1, // #1916 (obsolete action)
ActChgUsrPho, // #1917
+ ActFrmNewPrgRsc, // #1918
};
/*****************************************************************************/
diff --git a/swad_action.h b/swad_action.h
index 957eb8ef..c426c243 100644
--- a/swad_action.h
+++ b/swad_action.h
@@ -65,7 +65,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 1917
+#define Act_MAX_ACTION_COD 1918
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13
@@ -408,107 +408,108 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
#define ActDwnPrgItm (ActChgCrsSta + 25)
#define ActLftPrgItm (ActChgCrsSta + 26)
#define ActRgtPrgItm (ActChgCrsSta + 27)
-#define ActEdiTchGui (ActChgCrsSta + 28)
-#define ActSeeSylLec (ActChgCrsSta + 29)
-#define ActSeeSylPra (ActChgCrsSta + 30)
-#define ActEdiSylLec (ActChgCrsSta + 31)
-#define ActEdiSylPra (ActChgCrsSta + 32)
-#define ActDelItmSylLec (ActChgCrsSta + 33)
-#define ActDelItmSylPra (ActChgCrsSta + 34)
-#define ActUp_IteSylLec (ActChgCrsSta + 35)
-#define ActUp_IteSylPra (ActChgCrsSta + 36)
-#define ActDwnIteSylLec (ActChgCrsSta + 37)
-#define ActDwnIteSylPra (ActChgCrsSta + 38)
-#define ActRgtIteSylLec (ActChgCrsSta + 39)
-#define ActRgtIteSylPra (ActChgCrsSta + 40)
-#define ActLftIteSylLec (ActChgCrsSta + 41)
-#define ActLftIteSylPra (ActChgCrsSta + 42)
-#define ActInsIteSylLec (ActChgCrsSta + 43)
-#define ActInsIteSylPra (ActChgCrsSta + 44)
-#define ActModIteSylLec (ActChgCrsSta + 45)
-#define ActModIteSylPra (ActChgCrsSta + 46)
+#define ActFrmNewPrgRsc (ActChgCrsSta + 28)
+#define ActEdiTchGui (ActChgCrsSta + 29)
+#define ActSeeSylLec (ActChgCrsSta + 30)
+#define ActSeeSylPra (ActChgCrsSta + 31)
+#define ActEdiSylLec (ActChgCrsSta + 32)
+#define ActEdiSylPra (ActChgCrsSta + 33)
+#define ActDelItmSylLec (ActChgCrsSta + 34)
+#define ActDelItmSylPra (ActChgCrsSta + 35)
+#define ActUp_IteSylLec (ActChgCrsSta + 36)
+#define ActUp_IteSylPra (ActChgCrsSta + 37)
+#define ActDwnIteSylLec (ActChgCrsSta + 38)
+#define ActDwnIteSylPra (ActChgCrsSta + 39)
+#define ActRgtIteSylLec (ActChgCrsSta + 40)
+#define ActRgtIteSylPra (ActChgCrsSta + 41)
+#define ActLftIteSylLec (ActChgCrsSta + 42)
+#define ActLftIteSylPra (ActChgCrsSta + 43)
+#define ActInsIteSylLec (ActChgCrsSta + 44)
+#define ActInsIteSylPra (ActChgCrsSta + 45)
+#define ActModIteSylLec (ActChgCrsSta + 46)
+#define ActModIteSylPra (ActChgCrsSta + 47)
-#define ActEdiBib (ActChgCrsSta + 47)
-#define ActEdiFAQ (ActChgCrsSta + 48)
-#define ActEdiCrsLnk (ActChgCrsSta + 49)
+#define ActEdiBib (ActChgCrsSta + 48)
+#define ActEdiFAQ (ActChgCrsSta + 49)
+#define ActEdiCrsLnk (ActChgCrsSta + 50)
-#define ActChgFrcReaCrsInf (ActChgCrsSta + 50)
-#define ActChgFrcReaTchGui (ActChgCrsSta + 51)
-#define ActChgFrcReaSylLec (ActChgCrsSta + 52)
-#define ActChgFrcReaSylPra (ActChgCrsSta + 53)
-#define ActChgFrcReaBib (ActChgCrsSta + 54)
-#define ActChgFrcReaFAQ (ActChgCrsSta + 55)
-#define ActChgFrcReaCrsLnk (ActChgCrsSta + 56)
+#define ActChgFrcReaCrsInf (ActChgCrsSta + 51)
+#define ActChgFrcReaTchGui (ActChgCrsSta + 52)
+#define ActChgFrcReaSylLec (ActChgCrsSta + 53)
+#define ActChgFrcReaSylPra (ActChgCrsSta + 54)
+#define ActChgFrcReaBib (ActChgCrsSta + 55)
+#define ActChgFrcReaFAQ (ActChgCrsSta + 56)
+#define ActChgFrcReaCrsLnk (ActChgCrsSta + 57)
-#define ActChgHavReaCrsInf (ActChgCrsSta + 57)
-#define ActChgHavReaTchGui (ActChgCrsSta + 58)
-#define ActChgHavReaSylLec (ActChgCrsSta + 59)
-#define ActChgHavReaSylPra (ActChgCrsSta + 60)
-#define ActChgHavReaBib (ActChgCrsSta + 61)
-#define ActChgHavReaFAQ (ActChgCrsSta + 62)
-#define ActChgHavReaCrsLnk (ActChgCrsSta + 63)
+#define ActChgHavReaCrsInf (ActChgCrsSta + 58)
+#define ActChgHavReaTchGui (ActChgCrsSta + 59)
+#define ActChgHavReaSylLec (ActChgCrsSta + 60)
+#define ActChgHavReaSylPra (ActChgCrsSta + 61)
+#define ActChgHavReaBib (ActChgCrsSta + 62)
+#define ActChgHavReaFAQ (ActChgCrsSta + 63)
+#define ActChgHavReaCrsLnk (ActChgCrsSta + 64)
-#define ActSelInfSrcCrsInf (ActChgCrsSta + 64)
-#define ActSelInfSrcTchGui (ActChgCrsSta + 65)
-#define ActSelInfSrcSylLec (ActChgCrsSta + 66)
-#define ActSelInfSrcSylPra (ActChgCrsSta + 67)
-#define ActSelInfSrcBib (ActChgCrsSta + 68)
-#define ActSelInfSrcFAQ (ActChgCrsSta + 69)
-#define ActSelInfSrcCrsLnk (ActChgCrsSta + 70)
-#define ActRcvURLCrsInf (ActChgCrsSta + 71)
-#define ActRcvURLTchGui (ActChgCrsSta + 72)
-#define ActRcvURLSylLec (ActChgCrsSta + 73)
-#define ActRcvURLSylPra (ActChgCrsSta + 74)
-#define ActRcvURLBib (ActChgCrsSta + 75)
-#define ActRcvURLFAQ (ActChgCrsSta + 76)
-#define ActRcvURLCrsLnk (ActChgCrsSta + 77)
-#define ActRcvPagCrsInf (ActChgCrsSta + 78)
-#define ActRcvPagTchGui (ActChgCrsSta + 79)
-#define ActRcvPagSylLec (ActChgCrsSta + 80)
-#define ActRcvPagSylPra (ActChgCrsSta + 81)
-#define ActRcvPagBib (ActChgCrsSta + 82)
-#define ActRcvPagFAQ (ActChgCrsSta + 83)
-#define ActRcvPagCrsLnk (ActChgCrsSta + 84)
-#define ActEditorCrsInf (ActChgCrsSta + 85)
-#define ActEditorTchGui (ActChgCrsSta + 86)
-#define ActEditorSylLec (ActChgCrsSta + 87)
-#define ActEditorSylPra (ActChgCrsSta + 88)
-#define ActEditorBib (ActChgCrsSta + 89)
-#define ActEditorFAQ (ActChgCrsSta + 90)
-#define ActEditorCrsLnk (ActChgCrsSta + 91)
-#define ActPlaTxtEdiCrsInf (ActChgCrsSta + 92)
-#define ActPlaTxtEdiTchGui (ActChgCrsSta + 93)
-#define ActPlaTxtEdiSylLec (ActChgCrsSta + 94)
-#define ActPlaTxtEdiSylPra (ActChgCrsSta + 95)
-#define ActPlaTxtEdiBib (ActChgCrsSta + 96)
-#define ActPlaTxtEdiFAQ (ActChgCrsSta + 97)
-#define ActPlaTxtEdiCrsLnk (ActChgCrsSta + 98)
-#define ActRchTxtEdiCrsInf (ActChgCrsSta + 99)
-#define ActRchTxtEdiTchGui (ActChgCrsSta + 100)
-#define ActRchTxtEdiSylLec (ActChgCrsSta + 101)
-#define ActRchTxtEdiSylPra (ActChgCrsSta + 102)
-#define ActRchTxtEdiBib (ActChgCrsSta + 103)
-#define ActRchTxtEdiFAQ (ActChgCrsSta + 104)
-#define ActRchTxtEdiCrsLnk (ActChgCrsSta + 105)
-#define ActRcvPlaTxtCrsInf (ActChgCrsSta + 106)
-#define ActRcvPlaTxtTchGui (ActChgCrsSta + 107)
-#define ActRcvPlaTxtSylLec (ActChgCrsSta + 108)
-#define ActRcvPlaTxtSylPra (ActChgCrsSta + 109)
-#define ActRcvPlaTxtBib (ActChgCrsSta + 110)
-#define ActRcvPlaTxtFAQ (ActChgCrsSta + 111)
-#define ActRcvPlaTxtCrsLnk (ActChgCrsSta + 112)
-#define ActRcvRchTxtCrsInf (ActChgCrsSta + 113)
-#define ActRcvRchTxtTchGui (ActChgCrsSta + 114)
-#define ActRcvRchTxtSylLec (ActChgCrsSta + 115)
-#define ActRcvRchTxtSylPra (ActChgCrsSta + 116)
-#define ActRcvRchTxtBib (ActChgCrsSta + 117)
-#define ActRcvRchTxtFAQ (ActChgCrsSta + 118)
-#define ActRcvRchTxtCrsLnk (ActChgCrsSta + 119)
+#define ActSelInfSrcCrsInf (ActChgCrsSta + 65)
+#define ActSelInfSrcTchGui (ActChgCrsSta + 66)
+#define ActSelInfSrcSylLec (ActChgCrsSta + 67)
+#define ActSelInfSrcSylPra (ActChgCrsSta + 68)
+#define ActSelInfSrcBib (ActChgCrsSta + 69)
+#define ActSelInfSrcFAQ (ActChgCrsSta + 70)
+#define ActSelInfSrcCrsLnk (ActChgCrsSta + 71)
+#define ActRcvURLCrsInf (ActChgCrsSta + 72)
+#define ActRcvURLTchGui (ActChgCrsSta + 73)
+#define ActRcvURLSylLec (ActChgCrsSta + 74)
+#define ActRcvURLSylPra (ActChgCrsSta + 75)
+#define ActRcvURLBib (ActChgCrsSta + 76)
+#define ActRcvURLFAQ (ActChgCrsSta + 77)
+#define ActRcvURLCrsLnk (ActChgCrsSta + 78)
+#define ActRcvPagCrsInf (ActChgCrsSta + 79)
+#define ActRcvPagTchGui (ActChgCrsSta + 80)
+#define ActRcvPagSylLec (ActChgCrsSta + 81)
+#define ActRcvPagSylPra (ActChgCrsSta + 82)
+#define ActRcvPagBib (ActChgCrsSta + 83)
+#define ActRcvPagFAQ (ActChgCrsSta + 84)
+#define ActRcvPagCrsLnk (ActChgCrsSta + 85)
+#define ActEditorCrsInf (ActChgCrsSta + 86)
+#define ActEditorTchGui (ActChgCrsSta + 87)
+#define ActEditorSylLec (ActChgCrsSta + 88)
+#define ActEditorSylPra (ActChgCrsSta + 89)
+#define ActEditorBib (ActChgCrsSta + 90)
+#define ActEditorFAQ (ActChgCrsSta + 91)
+#define ActEditorCrsLnk (ActChgCrsSta + 92)
+#define ActPlaTxtEdiCrsInf (ActChgCrsSta + 93)
+#define ActPlaTxtEdiTchGui (ActChgCrsSta + 94)
+#define ActPlaTxtEdiSylLec (ActChgCrsSta + 95)
+#define ActPlaTxtEdiSylPra (ActChgCrsSta + 96)
+#define ActPlaTxtEdiBib (ActChgCrsSta + 97)
+#define ActPlaTxtEdiFAQ (ActChgCrsSta + 98)
+#define ActPlaTxtEdiCrsLnk (ActChgCrsSta + 99)
+#define ActRchTxtEdiCrsInf (ActChgCrsSta + 100)
+#define ActRchTxtEdiTchGui (ActChgCrsSta + 101)
+#define ActRchTxtEdiSylLec (ActChgCrsSta + 102)
+#define ActRchTxtEdiSylPra (ActChgCrsSta + 103)
+#define ActRchTxtEdiBib (ActChgCrsSta + 104)
+#define ActRchTxtEdiFAQ (ActChgCrsSta + 105)
+#define ActRchTxtEdiCrsLnk (ActChgCrsSta + 106)
+#define ActRcvPlaTxtCrsInf (ActChgCrsSta + 107)
+#define ActRcvPlaTxtTchGui (ActChgCrsSta + 108)
+#define ActRcvPlaTxtSylLec (ActChgCrsSta + 109)
+#define ActRcvPlaTxtSylPra (ActChgCrsSta + 110)
+#define ActRcvPlaTxtBib (ActChgCrsSta + 111)
+#define ActRcvPlaTxtFAQ (ActChgCrsSta + 112)
+#define ActRcvPlaTxtCrsLnk (ActChgCrsSta + 113)
+#define ActRcvRchTxtCrsInf (ActChgCrsSta + 114)
+#define ActRcvRchTxtTchGui (ActChgCrsSta + 115)
+#define ActRcvRchTxtSylLec (ActChgCrsSta + 116)
+#define ActRcvRchTxtSylPra (ActChgCrsSta + 117)
+#define ActRcvRchTxtBib (ActChgCrsSta + 118)
+#define ActRcvRchTxtFAQ (ActChgCrsSta + 119)
+#define ActRcvRchTxtCrsLnk (ActChgCrsSta + 120)
-#define ActPrnCrsTT (ActChgCrsSta + 120)
-#define ActEdiCrsTT (ActChgCrsSta + 121)
-#define ActChgCrsTT (ActChgCrsSta + 122)
-#define ActChgCrsTT1stDay (ActChgCrsSta + 123)
+#define ActPrnCrsTT (ActChgCrsSta + 121)
+#define ActEdiCrsTT (ActChgCrsSta + 122)
+#define ActChgCrsTT (ActChgCrsSta + 123)
+#define ActChgCrsTT1stDay (ActChgCrsSta + 124)
/*****************************************************************************/
/***************************** Assessment tab ********************************/
diff --git a/swad_box.c b/swad_box.c
index 0e75ca99..25238d51 100644
--- a/swad_box.c
+++ b/swad_box.c
@@ -222,16 +222,16 @@ void Box_BoxWithButtonEnd (Btn_Button_t Button,const char *TxtButton)
void Box_BoxEnd (void)
{
- /***** Check level of nesting *****/
- if (Gbl.Box.Nested < 0)
- Err_ShowErrorAndExit ("Trying to end a box not open.");
+ /***** Check level of nesting *****/
+ if (Gbl.Box.Nested < 0)
+ Err_ShowErrorAndExit ("Trying to end a box not open.");
- /***** Free memory allocated for box id string *****/
- if (Gbl.Box.Ids[Gbl.Box.Nested])
- free (Gbl.Box.Ids[Gbl.Box.Nested]);
+ /***** Free memory allocated for box id string *****/
+ if (Gbl.Box.Ids[Gbl.Box.Nested])
+ free (Gbl.Box.Ids[Gbl.Box.Nested]);
- /***** End box and box container *****/
- HTM_DIV_End ();
+ /***** End box and box container *****/
+ HTM_DIV_End ();
HTM_DIV_End ();
/***** Decrease level of nesting *****/
diff --git a/swad_changelog.h b/swad_changelog.h
index 8f16440d..885432bb 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -606,10 +606,14 @@ TODO: Fix bug: error al enviar un mensaje a dos recipientes, error on duplicate
TODO: Attach pdf files in multimedia.
*/
-#define Log_PLATFORM_VERSION "SWAD 21.103.6 (2022-07-01)"
+#define Log_PLATFORM_VERSION "SWAD 21.104 (2022-07-12)"
#define CSS_FILE "swad21.103.6.css"
#define JS_FILE "swad21.100.js"
/*
+ Version 21.104: Jul 12, 2022 Adding resources to program items. (? lines)
+ 1 change necessary in database:
+CREATE TABLE IF NOT EXISTS prg_resources (RscCod INT NOT NULL AUTO_INCREMENT,ItmCod INT NOT NULL DEFAULT -1,RscInd INT NOT NULL DEFAULT 0,Hidden ENUM('N','Y') NOT NULL DEFAULT 'N',Title VARCHAR(2047) NOT NULL,UNIQUE INDEX(RscCod),UNIQUE INDEX(ItmCod,RscInd));
+
Version 21.103.6: Jul 01, 2022 Fixed issues in matches. (327737 lines)
Version 21.103.5: Jun 30, 2022 Code refactoring in icons. (327727 lines)
Version 21.103.4: Jun 30, 2022 Code refactoring in icons. (327968 lines)
diff --git a/swad_database.c b/swad_database.c
index f97246d0..1def65d0 100644
--- a/swad_database.c
+++ b/swad_database.c
@@ -2451,6 +2451,29 @@ mysql> DESCRIBE prg_items;
"UNIQUE INDEX(ItmCod),"
"UNIQUE INDEX(CrsCod,ItmInd))");
+ /***** Table prg_resources *****/
+/*
+mysql> DESCRIBE prg_resources;
++--------+---------------+------+-----+---------+----------------+
+| Field | Type | Null | Key | Default | Extra |
++--------+---------------+------+-----+---------+----------------+
+| RscCod | int | NO | PRI | NULL | auto_increment |
+| ItmCod | int | NO | MUL | -1 | |
+| RscInd | int | NO | | 0 | |
+| Hidden | enum('N','Y') | NO | | N | |
+| Title | varchar(2047) | NO | | NULL | |
++--------+---------------+------+-----+---------+----------------+
+5 rows in set (0,00 sec)
+*/
+ DB_CreateTable ("CREATE TABLE IF NOT EXISTS prg_resources ("
+ "RscCod INT NOT NULL AUTO_INCREMENT,"
+ "ItmCod INT NOT NULL DEFAULT -1,"
+ "RscInd INT NOT NULL DEFAULT 0,"
+ "Hidden ENUM('N','Y') NOT NULL DEFAULT 'N',"
+ "Title VARCHAR(2047) NOT NULL," // PrgRsc_MAX_BYTES_PROGRAM_RESOURCE_TITLE
+ "UNIQUE INDEX(RscCod),"
+ "UNIQUE INDEX(ItmCod,RscInd))");
+
/***** Table prj_config *****/
/*
mysql> DESCRIBE prj_config;
diff --git a/swad_program.c b/swad_program.c
index c03b9f3c..f9baa2f9 100644
--- a/swad_program.c
+++ b/swad_program.c
@@ -46,6 +46,7 @@
#include "swad_photo.h"
#include "swad_program.h"
#include "swad_program_database.h"
+#include "swad_program_resource.h"
#include "swad_role.h"
#include "swad_setting.h"
#include "swad_string.h"
@@ -116,7 +117,6 @@ static void Prg_ShowCourseProgramHighlightingItem (const struct Prg_ItemRange *T
static void Prg_ShowAllItems (Prg_CreateOrChangeItem_t CreateOrChangeItem,
const struct Prg_ItemRange *ToHighlight,
long ParentItmCod,long ItmCodBeforeForm,unsigned FormLevel);
-static bool Prg_CheckIfICanCreateItems (void);
static void Prg_PutIconsListItems (__attribute__((unused)) void *Args);
static void Prg_PutIconToCreateNewItem (void);
static void Prg_PutButtonToCreateNewItem (void);
@@ -149,8 +149,6 @@ static bool Prg_CheckIfMoveDownIsAllowed (unsigned NumItem);
static bool Prg_CheckIfMoveLeftIsAllowed (unsigned NumItem);
static bool Prg_CheckIfMoveRightIsAllowed (unsigned NumItem);
-static void Prg_PutParams (void *ItmCod);
-
static void Prg_GetListItems (void);
static void Prg_GetDataOfItemByCod (struct Prg_Item *Item);
static void Prg_GetDataOfItem (struct Prg_Item *Item,
@@ -182,6 +180,7 @@ static void Prg_ShowFormToChangeItem (long ItmCod);
static void Prg_ShowFormItem (const struct Prg_Item *Item,
const Dat_SetHMS SetHMS[Dat_NUM_START_END_TIME],
const char *Txt);
+
static void Prg_InsertItem (const struct Prg_Item *ParentItem,
struct Prg_Item *Item,const char *Txt);
@@ -279,14 +278,13 @@ static void Prg_ShowAllItems (Prg_CreateOrChangeItem_t CreateOrChangeItem,
case Prg_PUT_FORM_CHANGE_ITEM:
Prg_WriteRowWithItemForm (Prg_PUT_FORM_CHANGE_ITEM,
ItmCodBeforeForm,FormLevel);
- break;
}
/* End range to highlight? */
if (Item.Hierarchy.Index == ToHighlight->End) // End of the highlighted range
{
HTM_TBODY_End (); // Highlighted tbody end
- if (NumItem < Prg_Gbl.List.NumItems - 1) // Not the last item
+ if (NumItem < Prg_Gbl.List.NumItems - 1) // Not the last item
HTM_TBODY_Begin (NULL); // 3rd tbody begin
}
@@ -294,7 +292,8 @@ static void Prg_ShowAllItems (Prg_CreateOrChangeItem_t CreateOrChangeItem,
}
/***** Create item at the end? *****/
- if (ItmCodBeforeForm <= 0 && CreateOrChangeItem == Prg_PUT_FORM_CREATE_ITEM)
+ if (ItmCodBeforeForm <= 0 &&
+ CreateOrChangeItem == Prg_PUT_FORM_CREATE_ITEM)
Prg_WriteRowWithItemForm (Prg_PUT_FORM_CREATE_ITEM,-1L,1);
/***** End table *****/
@@ -316,7 +315,7 @@ static void Prg_ShowAllItems (Prg_CreateOrChangeItem_t CreateOrChangeItem,
/******************* Check if I can create program items *********************/
/*****************************************************************************/
-static bool Prg_CheckIfICanCreateItems (void)
+bool Prg_CheckIfICanCreateItems (void)
{
return Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM;
@@ -543,9 +542,18 @@ static void Prg_WriteRowWithItemForm (Prg_CreateOrChangeItem_t CreateOrChangeIte
ColSpan = (Prg_GetMaxItemLevel () + 4) - FormLevel;
HTM_TD_Begin ("colspan=\"%u\" class=\"PRG_MAIN %s\"",
ColSpan,The_GetColorRows ());
+ /* Form for item data */
HTM_ARTICLE_Begin ("item_form");
ShowForm[CreateOrChangeItem] (ItmCod);
HTM_ARTICLE_End ();
+
+ /* List of item resources */
+ if (CreateOrChangeItem == Prg_PUT_FORM_CHANGE_ITEM)
+ {
+ HTM_ARTICLE_Begin ("rsc_form");
+ PrgRsc_ShowAllResources (ItmCod);
+ HTM_ARTICLE_End ();
+ }
HTM_TD_End ();
/***** End row *****/
@@ -880,7 +888,7 @@ static bool Prg_CheckIfMoveRightIsAllowed (unsigned NumItem)
/******************** Params used to edit a program item *********************/
/*****************************************************************************/
-static void Prg_PutParams (void *ItmCod)
+void Prg_PutParams (void *ItmCod)
{
if (ItmCod)
if (*((long *) ItmCod) > 0)
@@ -1758,7 +1766,7 @@ static void Prg_ShowFormItem (const struct Prg_Item *Item,
/* Data */
HTM_TD_Begin ("class=\"LT\"");
- HTM_TEXTAREA_Begin ("id=\"Txt\" name=\"Txt\" rows=\"25\""
+ HTM_TEXTAREA_Begin ("id=\"Txt\" name=\"Txt\" rows=\"10\""
" class=\"PRG_TITLE_DESCRIPTION_WIDTH INPUT_%s\"",
The_GetSuffix ());
if (Txt)
@@ -1830,7 +1838,7 @@ void Prg_ReceiveFormNewItem (void)
void Prg_ReceiveFormChgItem (void)
{
- struct Prg_Item OldItem; // Current program item data in database
+ // struct Prg_Item OldItem; // Current program item data in database
struct Prg_Item NewItem; // Item data received from form
char Description[Cns_MAX_BYTES_TEXT + 1];
struct Prg_ItemRange ToHighlight;
@@ -1845,8 +1853,8 @@ void Prg_ReceiveFormChgItem (void)
Err_WrongItemExit ();
/***** Get data of the old (current) program item from database *****/
- OldItem.Hierarchy.ItmCod = NewItem.Hierarchy.ItmCod;
- Prg_GetDataOfItemByCod (&OldItem);
+ // OldItem.Hierarchy.ItmCod = NewItem.Hierarchy.ItmCod;
+ // Prg_GetDataOfItemByCod (&OldItem);
/***** Get start/end date-times *****/
NewItem.TimeUTC[Dat_STR_TIME] = Dat_GetTimeUTCFromForm ("StartTimeUTC");
diff --git a/swad_program.h b/swad_program.h
index a63a1533..46252dff 100644
--- a/swad_program.h
+++ b/swad_program.h
@@ -77,6 +77,8 @@ typedef enum
void Prg_ShowCourseProgram (void);
+bool Prg_CheckIfICanCreateItems (void);
+void Prg_PutParams (void *ItmCod);
void Prg_RequestCreateItem (void);
void Prg_RequestChangeItem (void);
void Prg_ReceiveFormNewItem (void);
diff --git a/swad_program_database.c b/swad_program_database.c
index a6b7d086..4119739a 100644
--- a/swad_program_database.c
+++ b/swad_program_database.c
@@ -255,6 +255,59 @@ void Prg_DB_GetItemTxt (long ItmCod,char Txt[Cns_MAX_BYTES_TEXT + 1])
Gbl.Hierarchy.Crs.CrsCod);
}
+/*****************************************************************************/
+/****************** Get list of item resources from database *****************/
+/*****************************************************************************/
+
+unsigned Prg_DB_GetListResources (MYSQL_RES **mysql_res,long ItmCod)
+ {
+ static const char *HiddenSubQuery[Rol_NUM_ROLES] =
+ {
+ [Rol_UNK ] = " AND Hidden='N'",
+ [Rol_GST ] = " AND Hidden='N'",
+ [Rol_USR ] = " AND Hidden='N'",
+ [Rol_STD ] = " AND Hidden='N'",
+ [Rol_NET ] = " AND Hidden='N'",
+ [Rol_TCH ] = "",
+ [Rol_DEG_ADM] = " AND Hidden='N'",
+ [Rol_CTR_ADM] = " AND Hidden='N'",
+ [Rol_INS_ADM] = " AND Hidden='N'",
+ [Rol_SYS_ADM] = "",
+ };
+
+ return (unsigned)
+ DB_QuerySELECT (mysql_res,"can not get item resources",
+ "SELECT ItmCod," // row[0]
+ "RscCod," // row[1]
+ "Hidden," // row[2]
+ "Title" // row[3]
+ " FROM prg_resources"
+ " WHERE ItmCod=%ld"
+ "%s"
+ " ORDER BY RscInd",
+ ItmCod,
+ HiddenSubQuery[Gbl.Usrs.Me.Role.Logged]);
+ }
+
+/*****************************************************************************/
+/****************** Get item resource data using its code ********************/
+/*****************************************************************************/
+
+unsigned Prg_DB_GetDataOfResourceByCod (MYSQL_RES **mysql_res,
+ long ItmCod,long RscCod)
+ {
+ return (unsigned)
+ DB_QuerySELECT (mysql_res,"can not get item resource data",
+ "SELECT ItmCod," // row[0]
+ "RscCod," // row[1]
+ "Hidden," // row[2]
+ "Title" // row[3]
+ " FROM prg_resources"
+ " WHERE RscCod=%ld"
+ " AND ItmCod=%ld", // Extra check
+ RscCod,ItmCod);
+ }
+
/*****************************************************************************/
/****************** Get number of courses with program items *****************/
/*****************************************************************************/
diff --git a/swad_program_database.h b/swad_program_database.h
index 558bff97..a0d34e10 100644
--- a/swad_program_database.h
+++ b/swad_program_database.h
@@ -47,6 +47,11 @@ void Prg_DB_MoveLeftRightItemRange (const struct Prg_ItemRange *ToMove,
unsigned Prg_DB_GetListItems (MYSQL_RES **mysql_res);
unsigned Prg_DB_GetDataOfItemByCod (MYSQL_RES **mysql_res,long ItmCod);
void Prg_DB_GetItemTxt (long ItmCod,char Txt[Cns_MAX_BYTES_TEXT + 1]);
+
+unsigned Prg_DB_GetListResources (MYSQL_RES **mysql_res,long ItmCod);
+unsigned Prg_DB_GetDataOfResourceByCod (MYSQL_RES **mysql_res,
+ long ItmCod,long RscCod);
+
unsigned Prg_DB_GetNumCoursesWithItems (HieLvl_Level_t Scope);
unsigned Prg_DB_GetNumItems (HieLvl_Level_t Scope);
diff --git a/swad_program_resource.c b/swad_program_resource.c
new file mode 100644
index 00000000..b73ac1f8
--- /dev/null
+++ b/swad_program_resource.c
@@ -0,0 +1,377 @@
+// swad_program.c: course program
+
+/*
+ SWAD (Shared Workspace At a Distance),
+ is a web platform developed at the University of Granada (Spain),
+ and used to support university teaching.
+
+ This file is part of SWAD core.
+ Copyright (C) 1999-2021 Antonio Cañas Vargas
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+/*****************************************************************************/
+/********************************* Headers ***********************************/
+/*****************************************************************************/
+
+// #define _GNU_SOURCE // For asprintf
+// #include // For PATH_MAX
+// #include // For NULL
+// #include // For asprintf
+// #include // For calloc
+// #include // For string functions
+
+// #include "swad_autolink.h"
+// #include "swad_box.h"
+// #include "swad_database.h"
+// #include "swad_error.h"
+// #include "swad_figure.h"
+#include "swad_form.h"
+#include "swad_global.h"
+// #include "swad_hierarchy_level.h"
+// #include "swad_HTML.h"
+// #include "swad_pagination.h"
+// #include "swad_parameter.h"
+// #include "swad_photo.h"
+#include "swad_program.h"
+#include "swad_program_database.h"
+#include "swad_program_resource.h"
+// #include "swad_role.h"
+// #include "swad_setting.h"
+// #include "swad_string.h"
+
+/*****************************************************************************/
+/************** External global variables from others modules ****************/
+/*****************************************************************************/
+
+extern struct Globals Gbl;
+
+/*****************************************************************************/
+/******************************* Private types *******************************/
+/*****************************************************************************/
+/*
+#define Prg_NUM_TYPES_FORMS 3
+typedef enum
+ {
+ Prg_DONT_PUT_FORM_ITEM,
+ Prg_PUT_FORM_CREATE_ITEM,
+ Prg_PUT_FORM_CHANGE_ITEM,
+ } Prg_CreateOrChangeItem_t;
+
+#define Prg_NUM_MOVEMENTS_UP_DOWN 2
+typedef enum
+ {
+ Prg_MOVE_UP,
+ Prg_MOVE_DOWN,
+ } Prg_MoveUpDown_t;
+
+struct Level
+ {
+ unsigned Number; // Numbers for each level from 1 to maximum level
+ bool Hidden; // If each level from 1 to maximum level is hidden
+ };
+*/
+/*****************************************************************************/
+/***************************** Private variables *****************************/
+/*****************************************************************************/
+/*
+static struct
+ {
+ struct
+ {
+ bool IsRead; // Is the list already read from database...
+ // ...or it needs to be read?
+ unsigned NumItems; // Number of items
+ struct Prg_ItemHierarchy *Items; // List of items
+ } List;
+ unsigned MaxLevel; // Maximum level of items
+ struct Level *Levels; // Numbers and hidden for each level from 1 to maximum level
+ } Prg_Gbl =
+ {
+ .List =
+ {
+ .IsRead = false,
+ .NumItems = 0,
+ .Items = NULL,
+ },
+ .MaxLevel = 0,
+ .Levels = NULL
+ };
+*/
+/*****************************************************************************/
+/***************************** Private prototypes ****************************/
+/*****************************************************************************/
+
+static void PrgRsc_PutIconsListResources (__attribute__((unused)) void *Args);
+static void PrgSrc_PutIconToCreateNewResource (long ItmCod);
+static void PrgRsc_PutButtonToCreateNewResource (long ItmCod);
+
+static void PrgRsc_GetDataOfResourceByCod (struct PrgRsc_Resource *Resource);
+static void PrgRsc_GetDataOfResource (struct PrgRsc_Resource *Resource,
+ MYSQL_RES **mysql_res);
+static void PrgRsc_ResetResource (struct PrgRsc_Resource *Resource);
+static void PrgRsc_WriteRowResource (unsigned NumRsc,struct PrgRsc_Resource *Resource,
+ bool PrintView);
+
+/*****************************************************************************/
+/************************* Show all program items ****************************/
+/*****************************************************************************/
+
+void PrgRsc_ShowAllResources (long ItmCod)
+ {
+ extern const char *Hlp_COURSE_Program;
+ extern const char *Txt_Resources;
+ MYSQL_RES *mysql_res;
+ unsigned NumRsc;
+ unsigned NumResources;
+ struct PrgRsc_Resource Resource;
+
+ /***** Trivial check *****/
+ if (ItmCod <= 0)
+ return;
+
+ /***** Begin box *****/
+ Box_BoxBegin ("100%",Txt_Resources,
+ PrgRsc_PutIconsListResources,&ItmCod,
+ Hlp_COURSE_Program,Box_NOT_CLOSABLE);
+
+ /***** Get list of item resources from database *****/
+ NumResources = Prg_DB_GetListResources (&mysql_res,ItmCod); // Resources found...
+
+ /***** Table *****/
+ HTM_TABLE_BeginWideMarginPadding (2);
+ HTM_TBODY_Begin (NULL); // 1st tbody start
+
+ /***** Write all item resources *****/
+ for (NumRsc = 1;
+ NumRsc <= NumResources;
+ NumRsc++)
+ {
+ /* Get data of this item resource */
+ PrgRsc_GetDataOfResource (&Resource,&mysql_res);
+
+ /* Show item */
+ PrgRsc_WriteRowResource (NumRsc,&Resource,false); // Not print view
+
+ /* Show form to create/change item */
+ /*
+ if (Item.Hierarchy.ItmCod == ItmCodBeforeForm)
+ switch (CreateOrChangeItem)
+ {
+ case Prg_DONT_PUT_FORM_ITEM:
+ break;
+ case Prg_PUT_FORM_CREATE_ITEM:
+ Prg_WriteRowWithItemForm (Prg_PUT_FORM_CREATE_ITEM,
+ ParentItmCod,FormLevel);
+ break;
+ case Prg_PUT_FORM_CHANGE_ITEM:
+ Prg_WriteRowWithItemForm (Prg_PUT_FORM_CHANGE_ITEM,
+ ItmCodBeforeForm,FormLevel);
+ break;
+ }
+ */
+
+ The_ChangeRowColor ();
+ }
+
+ /***** Create item at the end? *****/
+ /*
+ if (ItmCodBeforeForm <= 0 && CreateOrChangeItem == Prg_PUT_FORM_CREATE_ITEM)
+ Prg_WriteRowWithItemForm (Prg_PUT_FORM_CREATE_ITEM,-1L,1);
+ */
+
+ /***** End table *****/
+ HTM_TBODY_End (); // 3rd tbody end
+ HTM_TABLE_End ();
+
+ /***** Button to create a new program item *****/
+ if (Prg_CheckIfICanCreateItems ())
+ PrgRsc_PutButtonToCreateNewResource (ItmCod);
+
+ /***** End box *****/
+ Box_BoxEnd ();
+ }
+
+/*****************************************************************************/
+/************** Put contextual icons in list of item resources ***************/
+/*****************************************************************************/
+
+static void PrgRsc_PutIconsListResources (void *ItmCod)
+ {
+ /***** Put icon to create a new item resource *****/
+ if (ItmCod)
+ if (*((long *) ItmCod) > 0)
+ if (Prg_CheckIfICanCreateItems ())
+ PrgSrc_PutIconToCreateNewResource (*((long *) ItmCod));
+ }
+
+/*****************************************************************************/
+/****************** Put icon to create a new program item ********************/
+/*****************************************************************************/
+
+static void PrgSrc_PutIconToCreateNewResource (long ItmCod)
+ {
+ Ico_PutContextualIconToAdd (ActFrmNewPrgRsc,"rsc_form",
+ Prg_PutParams,&ItmCod);
+ }
+
+/*****************************************************************************/
+/***************** Put button to create a new item resource ******************/
+/*****************************************************************************/
+
+static void PrgRsc_PutButtonToCreateNewResource (long ItmCod)
+ {
+ extern const char *Txt_New_resource;
+
+ Frm_BeginFormAnchor (ActFrmNewPrgRsc,"rsc_form");
+ Prg_PutParams (&ItmCod);
+ Btn_PutConfirmButton (Txt_New_resource);
+ Frm_EndForm ();
+ }
+
+/*****************************************************************************/
+/*** Put a form to create/edit program resource and show current resources ***/
+/*****************************************************************************/
+
+void PrgRsc_RequestCreateResource (void)
+ {
+ // unsigned NumItem;
+ // long ItmCodBeforeForm;
+ // unsigned FormLevel;
+ // struct Prg_Item Item;
+
+ /***** Get list of program items *****/
+ // Prg_GetListItems ();
+
+ /***** Get data of the item from database *****/
+ // Item.Hierarchy.ItmCod = Prg_GetParamItmCod ();
+ // Prg_GetDataOfItemByCod (&Item);
+ // if (Item.Hierarchy.ItmCod <= 0)
+ // Err_WrongItemExit ();
+
+ /***** Show current program items, if any *****/
+ // Prg_SetItemRangeEmpty (&ToHighlight);
+ // Prg_ShowAllItems (Prg_PUT_FORM_CHANGE_ITEM,
+ // &ToHighlight,ParentItmCod,ItmCodBeforeForm,FormLevel);
+
+ /***** Free list of program items *****/
+ // Prg_FreeListItems ();
+ }
+
+/*****************************************************************************/
+/****************** Get item resource data using its code ********************/
+/*****************************************************************************/
+
+static void PrgRsc_GetDataOfResourceByCod (struct PrgRsc_Resource *Resource)
+ {
+ MYSQL_RES *mysql_res;
+
+ /***** Clear all item resource data *****/
+ PrgRsc_ResetResource (Resource);
+
+ if (Resource->RscCod > 0)
+ {
+ /***** Get data of item resource *****/
+ if (Prg_DB_GetDataOfResourceByCod (&mysql_res,
+ Resource->ItmCod,
+ Resource->RscCod))
+ PrgRsc_GetDataOfResource (Resource,&mysql_res);
+
+ /***** Free structure that stores the query result *****/
+ DB_FreeMySQLResult (&mysql_res);
+ }
+ }
+
+/*****************************************************************************/
+/************************* Get item resource data ****************************/
+/*****************************************************************************/
+
+static void PrgRsc_GetDataOfResource (struct PrgRsc_Resource *Resource,
+ MYSQL_RES **mysql_res)
+ {
+ MYSQL_ROW row;
+
+ /***** Get data of item resource from database *****/
+ /* Get row */
+ row = mysql_fetch_row (*mysql_res);
+ /*
+ ItmCod row[0]
+ RscCod row[1]
+ Hidden row[2]
+ Title row[3]
+ */
+ /* Get code of the program item (row[0]) */
+ Resource->ItmCod = Str_ConvertStrCodToLongCod (row[0]);
+
+ /* Get code of the item resource (row[1]) */
+ Resource->RscCod = Str_ConvertStrCodToLongCod (row[1]);
+
+ /* Get whether the program item is hidden (row(2)) */
+ Resource->Hidden = (row[2][0] == 'Y');
+
+ /* Get the title of the item resource (row[3]) */
+ Str_Copy (Resource->Title,row[3],sizeof (Resource->Title) - 1);
+ }
+
+/*****************************************************************************/
+/************************ Clear all item resource data ***********************/
+/*****************************************************************************/
+
+static void PrgRsc_ResetResource (struct PrgRsc_Resource *Resource)
+ {
+ Resource->Hidden = false;
+ Resource->Title[0] = '\0';
+ }
+
+/*****************************************************************************/
+/************************** Show one program item ****************************/
+/*****************************************************************************/
+
+static void PrgRsc_WriteRowResource (unsigned NumRsc,struct PrgRsc_Resource *Resource,
+ bool PrintView)
+ {
+ /***** Begin row *****/
+ HTM_TR_Begin (NULL);
+
+ /***** Forms to remove/edit this item resource *****/
+ if (!PrintView)
+ {
+ HTM_TD_Begin ("class=\"PRG_COL1 LT %s\"",The_GetColorRows ());
+ // Prg_PutFormsToRemEditOneItem (NumItem,Item);
+ HTM_TD_End ();
+ }
+
+ /***** Resource number *****/
+ HTM_TD_Begin ("class=\"PRG_NUM RT %s\"",The_GetColorRows ());
+ HTM_Unsigned (NumRsc);
+ HTM_TD_End ();
+
+ /***** Title and text *****/
+ /* Begin title and text */
+ if (PrintView)
+ HTM_TD_Begin ("class=\"PRG_MAIN\"");
+ else
+ HTM_TD_Begin ("class=\"PRG_MAIN %s\"",The_GetColorRows ());
+
+ /* Title */
+ HTM_DIV_Begin ("class=\"DAT\"");
+ HTM_Txt (Resource->Title);
+ HTM_DIV_End ();
+
+ /* End title and text */
+ HTM_TD_End ();
+
+ /***** End row *****/
+ HTM_TR_End ();
+ }
diff --git a/swad_program_resource.h b/swad_program_resource.h
new file mode 100644
index 00000000..fdc4124b
--- /dev/null
+++ b/swad_program_resource.h
@@ -0,0 +1,79 @@
+// swad_program_resource.h: course program (resources)
+
+#ifndef _SWAD_PRG_RSC
+#define _SWAD_PRG_RSC
+/*
+ SWAD (Shared Workspace At a Distance),
+ is a web platform developed at the University of Granada (Spain),
+ and used to support university teaching.
+
+ This file is part of SWAD core.
+ Copyright (C) 1999-2021 Antonio Cañas Vargas
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+/*****************************************************************************/
+/********************************* Headers ***********************************/
+/*****************************************************************************/
+
+// #include // For boolean type
+// #include // For time
+
+// #include "swad_database.h"
+// #include "swad_date.h"
+
+/*****************************************************************************/
+/************************** Public types and constants ***********************/
+/*****************************************************************************/
+
+#define PrgRsc_MAX_CHARS_PROGRAM_RESOURCE_TITLE (128 - 1) // 127
+#define PrgRsc_MAX_BYTES_PROGRAM_RESOURCE_TITLE ((PrgRsc_MAX_CHARS_PROGRAM_RESOURCE_TITLE + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
+/*
+struct Prg_ItemHierarchy
+ {
+ long ItmCod;
+ unsigned Index;
+ unsigned Level;
+ bool Hidden;
+ };
+*/
+struct PrgRsc_Resource
+ {
+ long ItmCod;
+ long RscCod;
+ bool Hidden;
+ char Title[PrgRsc_MAX_BYTES_PROGRAM_RESOURCE_TITLE + 1];
+ };
+/*
+struct Prg_ItemRange
+ {
+ unsigned Begin; // Index of the first item in the subtree
+ unsigned End; // Index of the last item in the subtree
+ };
+
+#define Prg_NUM_MOVEMENTS_LEFT_RIGHT 2
+typedef enum
+ {
+ Prg_MOVE_LEFT,
+ Prg_MOVE_RIGHT,
+ } Prg_MoveLeftRight_t;
+*/
+/*****************************************************************************/
+/***************************** Public prototypes *****************************/
+/*****************************************************************************/
+
+void PrgRsc_ShowAllResources (long ItmCod);
+void PrgRsc_RequestCreateResource (void);
+
+#endif
diff --git a/swad_text.c b/swad_text.c
index 14671bba..81f56844 100644
--- a/swad_text.c
+++ b/swad_text.c
@@ -2634,7 +2634,7 @@ const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME] =
#elif L==9 // pt
"Início"
#elif L==10 // tr
- "Start" // Çeviri lazim!
+ "Başlama"
#endif
,
[Dat_END_TIME] =
@@ -2657,7 +2657,7 @@ const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME] =
#elif L==9 // pt
"Fim"
#elif L==10 // tr
- "End" // Çeviri lazim!
+ "Son"
#endif
};
@@ -2773,7 +2773,7 @@ const char *Txt_Availability =
#elif L==9 // pt
"Disponibilidade";
#elif L==10 // tr
- "Availability"; // Çeviri lazim!
+ "Bulunma";
#endif
const char *Txt_average =
@@ -2796,7 +2796,7 @@ const char *Txt_average =
#elif L==9 // pt
"média";
#elif L==10 // tr
- "average"; // Çeviri lazim!
+ "ortalama";
#endif
const char *Txt_Average_number_BR_of_ASSIG_BR_per_course =
@@ -3213,7 +3213,7 @@ const char *Txt_Banner =
#elif L==9 // pt
"Banner";
#elif L==10 // tr
- "Banner"; // Çeviri lazim!
+ "Afiş";
#endif
const char *Txt_Banner_X_removed = // Warning: it is very important to include %s in the following sentences
@@ -3259,7 +3259,7 @@ const char *Txt_Banners =
#elif L==9 // pt
"Banners";
#elif L==10 // tr
- "Banners"; // Çeviri lazim!
+ "Afişler";
#endif
const char *Txt_Basic_public_profile =
@@ -3457,11 +3457,11 @@ const char *Txt_Briefcases =
#elif L==7 // it
"Penna USB";
#elif L==8 // pl
- "Briefcases"; // Potrzebujesz tlumaczenie
+ "Teczki";
#elif L==9 // pt
"Pasta";
#elif L==10 // tr
- "Briefcases"; // Çeviri lazim!
+ "Evrak çantaları";
#endif
const char *Txt_Building =
@@ -3484,7 +3484,7 @@ const char *Txt_Building =
#elif L==9 // pt
"Edifício";
#elif L==10 // tr
- "Building"; // Çeviri lazim!
+ "Bina";
#endif
const char *Txt_Building_X_removed = // Warning: it is very important to include %s in the following sentences
@@ -3604,7 +3604,7 @@ const char *Txt_BUILDINGS_ORDER[Bld_NUM_ORDERS] =
#elif L==9 // pt
"Nome abreviado"
#elif L==10 // tr
- "Short name" // Çeviri lazim!
+ "Kısa isim"
#endif
,
[Bld_ORDER_BY_FULL_NAME] =
@@ -3627,7 +3627,7 @@ const char *Txt_BUILDINGS_ORDER[Bld_NUM_ORDERS] =
#elif L==9 // pt
"Nome completo"
#elif L==10 // tr
- "Full name" // Çeviri lazim!
+ "Tam isim"
#endif
,
[Bld_ORDER_BY_LOCATION] =
@@ -13096,7 +13096,7 @@ const char *Txt_EXAMS_ORDER[Exa_NUM_ORDERS] =
#elif L==9 // pt
"Início"
#elif L==10 // tr
- "Start" // Çeviri lazim!
+ "Başlama"
#endif
,
[Exa_ORDER_BY_END_DATE] =
@@ -13119,7 +13119,7 @@ const char *Txt_EXAMS_ORDER[Exa_NUM_ORDERS] =
#elif L==9 // pt
"Fim"
#elif L==10 // tr
- "End" // Çeviri lazim!
+ "Son"
#endif
,
[Exa_ORDER_BY_TITLE] =
@@ -15458,7 +15458,7 @@ const char *Txt_Full_name =
#elif L==9 // pt
"Nome completo";
#elif L==10 // tr
- "Full name"; // Çeviri lazim!
+ "Tam isim";
#endif
const char *Txt_Full_name_of_the_degree =
@@ -15667,7 +15667,7 @@ const char *Txt_GAMES_ORDER[Gam_NUM_ORDERS] =
#elif L==9 // pt
"Início"
#elif L==10 // tr
- "Start" // Çeviri lazim!
+ "Başlama"
#endif
,
[Gam_ORDER_BY_END_DATE] =
@@ -15690,7 +15690,7 @@ const char *Txt_GAMES_ORDER[Gam_NUM_ORDERS] =
#elif L==9 // pt
"Fim"
#elif L==10 // tr
- "End" // Çeviri lazim!
+ "Son"
#endif
,
[Gam_ORDER_BY_TITLE] =
@@ -20376,7 +20376,7 @@ const char *Txt_MATCH_End =
#elif L==9 // pt
"Fim";
#elif L==10 // tr
- "End"; // Çeviri lazim!
+ "Son";
#endif
const char *Txt_MATCH_Paused =
@@ -20468,7 +20468,7 @@ const char *Txt_MATCH_Start =
#elif L==9 // pt
"Início";
#elif L==10 // tr
- "Start"; // Çeviri lazim!
+ "Başlama";
#endif
const char *Txt_Match_X_removed = // Warning: it is very important to include %s in the following sentences
@@ -25339,6 +25339,29 @@ const char *Txt_New_record_field =
"New record field"; // Çeviri lazim!
#endif
+const char *Txt_New_resource =
+#if L==1 // ca
+ "Nou recurs";
+#elif L==2 // de
+ "Neue Ressource";
+#elif L==3 // en
+ "New resource";
+#elif L==4 // es
+ "Nuevo recurso";
+#elif L==5 // fr
+ "Nouvelle ressource";
+#elif L==6 // gn
+ "Nuevo recurso"; // Okoteve traducción
+#elif L==7 // it
+ "Nuova risorsa";
+#elif L==8 // pl
+ "Nowy zasób";
+#elif L==9 // pt
+ "Novo recurso";
+#elif L==10 // tr
+ "Yeni kaynak";
+#endif
+
const char *Txt_New_room =
#if L==1 // ca
"Nova sala";
@@ -35579,6 +35602,29 @@ const char *Txt_Reset_survey =
"Reset survey"; // Çeviri lazim!
#endif
+const char *Txt_Resources =
+#if L==1 // ca
+ "Recursos";
+#elif L==2 // de
+ "Ressourcen";
+#elif L==3 // en
+ "Resources";
+#elif L==4 // es
+ "Recursos";
+#elif L==5 // fr
+ "Ressources";
+#elif L==6 // gn
+ "Recursos"; // Okoteve traducción
+#elif L==7 // it
+ "Risorse";
+#elif L==8 // pl
+ "Zasoby";
+#elif L==9 // pt
+ "Recursos";
+#elif L==10 // tr
+ "Kaynaklar";
+#endif
+
const char *Txt_Result =
#if L==1 // ca
"Resultat";
@@ -40314,7 +40360,7 @@ const char *Txt_ROOMS_ORDER[Roo_NUM_ORDERS] =
#elif L==9 // pt
"Nome abreviado"
#elif L==10 // tr
- "Short name" // Çeviri lazim!
+ "Kısa isim"
#endif
,
[Roo_ORDER_BY_FULL_NAME] =
@@ -40337,7 +40383,7 @@ const char *Txt_ROOMS_ORDER[Roo_NUM_ORDERS] =
#elif L==9 // pt
"Nome completo"
#elif L==10 // tr
- "Full name" // Çeviri lazim!
+ "Tam isim"
#endif
,
[Roo_ORDER_BY_CAPACITY] =
@@ -43115,7 +43161,7 @@ const char *Txt_Short_name =
#elif L==9 // pt
"Nome abreviado";
#elif L==10 // tr
- "Short name"; // Çeviri lazim!
+ "Kısa isim";
#endif
const char *Txt_Short_name_of_the_degree =
@@ -45899,7 +45945,7 @@ const char *Txt_Start = // As a verb
#elif L==9 // pt
"Começar";
#elif L==10 // tr
- "Start"; // Çeviri lazim!
+ "Başlama";
#endif
const char *Txt_Statistic =