Version19.130

This commit is contained in:
Antonio Cañas Vargas 2020-02-20 23:48:48 +01:00
parent 6678457b38
commit 2520d5c852
18 changed files with 2476 additions and 124 deletions

View File

@ -50,7 +50,8 @@ OBJS = swad_account.o swad_action.o swad_agenda.o swad_alert.o \
swad_message.o swad_MFU.o \
swad_network.o swad_nickname.o swad_notice.o swad_notification.o \
swad_pagination.o swad_parameter.o swad_password.o swad_photo.o \
swad_place.o swad_plugin.o swad_privacy.o swad_profile.o swad_project.o \
swad_place.o swad_plugin.o swad_privacy.o swad_profile.o \
swad_program.o swad_project.o \
swad_QR.o \
swad_record.o swad_report.o swad_role.o swad_RSS.o \
swad_scope.o swad_search.o swad_session.o swad_setting.o \

View File

@ -1025,6 +1025,27 @@ CREATE TABLE IF NOT EXISTS plugins (
IP CHAR(15) NOT NULL,
UNIQUE INDEX(PlgCod));
--
-- Table prg_grp: stores the groups associated to each program item
--
CREATE TABLE IF NOT EXISTS prg_grp (
PrgIteCod INT NOT NULL,
GrpCod INT NOT NULL,
UNIQUE INDEX(PrgIteCod,GrpCod));
--
-- Table prg_items: stores the items of the course program
--
CREATE TABLE IF NOT EXISTS prg_items (
PrgIteCod INT NOT NULL AUTO_INCREMENT,
CrsCod INT NOT NULL DEFAULT -1,
Hidden ENUM('N','Y') NOT NULL DEFAULT 'N',
UsrCod INT NOT NULL,
StartTime DATETIME NOT NULL,
EndTime DATETIME NOT NULL,
Title VARCHAR(2047) NOT NULL,
Txt TEXT NOT NULL,
UNIQUE INDEX(PrgIteCod),
INDEX(CrsCod,Hidden));
--
-- Table prj_config: stores the configuration of projects for each course
--
CREATE TABLE IF NOT EXISTS prj_config (

View File

@ -73,6 +73,7 @@
#include "swad_photo.h"
#include "swad_privacy.h"
#include "swad_profile.h"
#include "swad_program.h"
#include "swad_project.h"
#include "swad_QR.h"
#include "swad_report.h"
@ -380,7 +381,7 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
// TabCrs ******************************************************************
// Actions in menu:
[ActSeeCrsInf ] = { 847, 0,TabCrs,ActSeeCrsInf ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Crs_ShowIntroduction ,"info" },
[ActSeeScd ] = {1821, 1,TabCrs,ActSeeScd ,0x200,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Crs_ShowIntroduction ,"clipboard-list" },
[ActSeePrg ] = {1821, 1,TabCrs,ActSeePrg ,0x200,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_SeeCourseProgram ,"clipboard-list" },
[ActSeeTchGui ] = { 784, 2,TabCrs,ActSeeTchGui ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Inf_ShowInfo ,"book-open" },
[ActSeeSyl ] = {1242, 3,TabCrs,ActSeeSyl ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Inf_ShowInfo ,"list-ol" },
[ActSeeBib ] = { 32, 4,TabCrs,ActSeeBib ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Inf_ShowInfo ,"book" },
@ -397,6 +398,16 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
[ActChgCrsYeaCfg ] = {1573,-1,TabUnk,ActSeeCrsInf ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,CrsCfg_ChangeCrsYear ,CrsCfg_ContEditAfterChgCrs ,NULL},
[ActEdiCrsInf ] = { 848,-1,TabUnk,ActSeeCrsInf ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Inf_FormsToSelSendInfo ,NULL},
[ActFrmNewPrgIte ] = {1822,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RequestCreatOrEditPrgItem ,NULL},
[ActEdiOnePrgIte ] = {1823,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RequestCreatOrEditPrgItem ,NULL},
[ActPrnOnePrgIte ] = {1824,-1,TabUnk,ActSeePrg ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,NULL ,Prg_PrintOnePrgItem ,NULL},
[ActNewPrgIte ] = {1825,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RecFormPrgItem ,NULL},
[ActChgPrgIte ] = {1826,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_RecFormPrgItem ,NULL},
[ActReqRemPrgIte ] = {1827,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_ReqRemPrgItem ,NULL},
[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},
[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},
@ -3536,7 +3547,16 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActSeeSysInf, // #1818
ActPrnSysInf, // #1819
ActMtn, // #1820
ActSeeScd, // #1821
ActSeePrg, // #1821
ActFrmNewPrgIte, // #1822
ActEdiOnePrgIte, // #1823
ActPrnOnePrgIte, // #1824
ActNewPrgIte, // #1825
ActChgPrgIte, // #1826
ActReqRemPrgIte, // #1827
ActRemPrgIte, // #1828
ActHidPrgIte, // #1829
ActShoPrgIte, // #1830
};
/*****************************************************************************/

View File

@ -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 1821
#define Act_MAX_ACTION_COD 1830
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13
@ -368,7 +368,7 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
/*****************************************************************************/
// Actions in menu
#define ActSeeCrsInf (ActChgCrsSta + 1)
#define ActSeeScd (ActChgCrsSta + 2)
#define ActSeePrg (ActChgCrsSta + 2)
#define ActSeeTchGui (ActChgCrsSta + 3)
#define ActSeeSyl (ActChgCrsSta + 4)
#define ActSeeBib (ActChgCrsSta + 5)
@ -384,107 +384,116 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
#define ActChgInsCrsCodCfg (ActChgCrsSta + 13)
#define ActChgCrsYeaCfg (ActChgCrsSta + 14)
#define ActEdiCrsInf (ActChgCrsSta + 15)
#define ActEdiTchGui (ActChgCrsSta + 16)
#define ActSeeSylLec (ActChgCrsSta + 17)
#define ActSeeSylPra (ActChgCrsSta + 18)
#define ActEdiSylLec (ActChgCrsSta + 19)
#define ActEdiSylPra (ActChgCrsSta + 20)
#define ActDelItmSylLec (ActChgCrsSta + 21)
#define ActDelItmSylPra (ActChgCrsSta + 22)
#define ActUp_IteSylLec (ActChgCrsSta + 23)
#define ActUp_IteSylPra (ActChgCrsSta + 24)
#define ActDwnIteSylLec (ActChgCrsSta + 25)
#define ActDwnIteSylPra (ActChgCrsSta + 26)
#define ActRgtIteSylLec (ActChgCrsSta + 27)
#define ActRgtIteSylPra (ActChgCrsSta + 28)
#define ActLftIteSylLec (ActChgCrsSta + 29)
#define ActLftIteSylPra (ActChgCrsSta + 30)
#define ActInsIteSylLec (ActChgCrsSta + 31)
#define ActInsIteSylPra (ActChgCrsSta + 32)
#define ActModIteSylLec (ActChgCrsSta + 33)
#define ActModIteSylPra (ActChgCrsSta + 34)
#define ActFrmNewPrgIte (ActChgCrsSta + 16)
#define ActEdiOnePrgIte (ActChgCrsSta + 17)
#define ActPrnOnePrgIte (ActChgCrsSta + 18)
#define ActNewPrgIte (ActChgCrsSta + 19)
#define ActChgPrgIte (ActChgCrsSta + 20)
#define ActReqRemPrgIte (ActChgCrsSta + 21)
#define ActRemPrgIte (ActChgCrsSta + 22)
#define ActHidPrgIte (ActChgCrsSta + 23)
#define ActShoPrgIte (ActChgCrsSta + 24)
#define ActEdiTchGui (ActChgCrsSta + 25)
#define ActSeeSylLec (ActChgCrsSta + 26)
#define ActSeeSylPra (ActChgCrsSta + 27)
#define ActEdiSylLec (ActChgCrsSta + 28)
#define ActEdiSylPra (ActChgCrsSta + 29)
#define ActDelItmSylLec (ActChgCrsSta + 30)
#define ActDelItmSylPra (ActChgCrsSta + 31)
#define ActUp_IteSylLec (ActChgCrsSta + 32)
#define ActUp_IteSylPra (ActChgCrsSta + 33)
#define ActDwnIteSylLec (ActChgCrsSta + 34)
#define ActDwnIteSylPra (ActChgCrsSta + 35)
#define ActRgtIteSylLec (ActChgCrsSta + 36)
#define ActRgtIteSylPra (ActChgCrsSta + 37)
#define ActLftIteSylLec (ActChgCrsSta + 38)
#define ActLftIteSylPra (ActChgCrsSta + 39)
#define ActInsIteSylLec (ActChgCrsSta + 40)
#define ActInsIteSylPra (ActChgCrsSta + 41)
#define ActModIteSylLec (ActChgCrsSta + 42)
#define ActModIteSylPra (ActChgCrsSta + 43)
#define ActEdiBib (ActChgCrsSta + 35)
#define ActEdiFAQ (ActChgCrsSta + 36)
#define ActEdiCrsLnk (ActChgCrsSta + 37)
#define ActEdiBib (ActChgCrsSta + 44)
#define ActEdiFAQ (ActChgCrsSta + 45)
#define ActEdiCrsLnk (ActChgCrsSta + 46)
#define ActChgFrcReaCrsInf (ActChgCrsSta + 38)
#define ActChgFrcReaTchGui (ActChgCrsSta + 39)
#define ActChgFrcReaSylLec (ActChgCrsSta + 40)
#define ActChgFrcReaSylPra (ActChgCrsSta + 41)
#define ActChgFrcReaBib (ActChgCrsSta + 42)
#define ActChgFrcReaFAQ (ActChgCrsSta + 43)
#define ActChgFrcReaCrsLnk (ActChgCrsSta + 44)
#define ActChgFrcReaCrsInf (ActChgCrsSta + 47)
#define ActChgFrcReaTchGui (ActChgCrsSta + 48)
#define ActChgFrcReaSylLec (ActChgCrsSta + 49)
#define ActChgFrcReaSylPra (ActChgCrsSta + 50)
#define ActChgFrcReaBib (ActChgCrsSta + 51)
#define ActChgFrcReaFAQ (ActChgCrsSta + 52)
#define ActChgFrcReaCrsLnk (ActChgCrsSta + 53)
#define ActChgHavReaCrsInf (ActChgCrsSta + 45)
#define ActChgHavReaTchGui (ActChgCrsSta + 46)
#define ActChgHavReaSylLec (ActChgCrsSta + 47)
#define ActChgHavReaSylPra (ActChgCrsSta + 48)
#define ActChgHavReaBib (ActChgCrsSta + 49)
#define ActChgHavReaFAQ (ActChgCrsSta + 50)
#define ActChgHavReaCrsLnk (ActChgCrsSta + 51)
#define ActChgHavReaCrsInf (ActChgCrsSta + 54)
#define ActChgHavReaTchGui (ActChgCrsSta + 55)
#define ActChgHavReaSylLec (ActChgCrsSta + 56)
#define ActChgHavReaSylPra (ActChgCrsSta + 57)
#define ActChgHavReaBib (ActChgCrsSta + 58)
#define ActChgHavReaFAQ (ActChgCrsSta + 59)
#define ActChgHavReaCrsLnk (ActChgCrsSta + 60)
#define ActSelInfSrcCrsInf (ActChgCrsSta + 52)
#define ActSelInfSrcTchGui (ActChgCrsSta + 53)
#define ActSelInfSrcSylLec (ActChgCrsSta + 54)
#define ActSelInfSrcSylPra (ActChgCrsSta + 55)
#define ActSelInfSrcBib (ActChgCrsSta + 56)
#define ActSelInfSrcFAQ (ActChgCrsSta + 57)
#define ActSelInfSrcCrsLnk (ActChgCrsSta + 58)
#define ActRcvURLCrsInf (ActChgCrsSta + 59)
#define ActRcvURLTchGui (ActChgCrsSta + 60)
#define ActRcvURLSylLec (ActChgCrsSta + 61)
#define ActRcvURLSylPra (ActChgCrsSta + 62)
#define ActRcvURLBib (ActChgCrsSta + 63)
#define ActRcvURLFAQ (ActChgCrsSta + 64)
#define ActRcvURLCrsLnk (ActChgCrsSta + 65)
#define ActRcvPagCrsInf (ActChgCrsSta + 66)
#define ActRcvPagTchGui (ActChgCrsSta + 67)
#define ActRcvPagSylLec (ActChgCrsSta + 68)
#define ActRcvPagSylPra (ActChgCrsSta + 69)
#define ActRcvPagBib (ActChgCrsSta + 70)
#define ActRcvPagFAQ (ActChgCrsSta + 71)
#define ActRcvPagCrsLnk (ActChgCrsSta + 72)
#define ActEditorCrsInf (ActChgCrsSta + 73)
#define ActEditorTchGui (ActChgCrsSta + 74)
#define ActEditorSylLec (ActChgCrsSta + 75)
#define ActEditorSylPra (ActChgCrsSta + 76)
#define ActEditorBib (ActChgCrsSta + 77)
#define ActEditorFAQ (ActChgCrsSta + 78)
#define ActEditorCrsLnk (ActChgCrsSta + 79)
#define ActPlaTxtEdiCrsInf (ActChgCrsSta + 80)
#define ActPlaTxtEdiTchGui (ActChgCrsSta + 81)
#define ActPlaTxtEdiSylLec (ActChgCrsSta + 82)
#define ActPlaTxtEdiSylPra (ActChgCrsSta + 83)
#define ActPlaTxtEdiBib (ActChgCrsSta + 84)
#define ActPlaTxtEdiFAQ (ActChgCrsSta + 85)
#define ActPlaTxtEdiCrsLnk (ActChgCrsSta + 86)
#define ActRchTxtEdiCrsInf (ActChgCrsSta + 87)
#define ActRchTxtEdiTchGui (ActChgCrsSta + 88)
#define ActRchTxtEdiSylLec (ActChgCrsSta + 89)
#define ActRchTxtEdiSylPra (ActChgCrsSta + 90)
#define ActRchTxtEdiBib (ActChgCrsSta + 91)
#define ActRchTxtEdiFAQ (ActChgCrsSta + 92)
#define ActRchTxtEdiCrsLnk (ActChgCrsSta + 93)
#define ActRcvPlaTxtCrsInf (ActChgCrsSta + 94)
#define ActRcvPlaTxtTchGui (ActChgCrsSta + 95)
#define ActRcvPlaTxtSylLec (ActChgCrsSta + 96)
#define ActRcvPlaTxtSylPra (ActChgCrsSta + 97)
#define ActRcvPlaTxtBib (ActChgCrsSta + 98)
#define ActRcvPlaTxtFAQ (ActChgCrsSta + 99)
#define ActRcvPlaTxtCrsLnk (ActChgCrsSta + 100)
#define ActRcvRchTxtCrsInf (ActChgCrsSta + 101)
#define ActRcvRchTxtTchGui (ActChgCrsSta + 102)
#define ActRcvRchTxtSylLec (ActChgCrsSta + 103)
#define ActRcvRchTxtSylPra (ActChgCrsSta + 104)
#define ActRcvRchTxtBib (ActChgCrsSta + 105)
#define ActRcvRchTxtFAQ (ActChgCrsSta + 106)
#define ActRcvRchTxtCrsLnk (ActChgCrsSta + 107)
#define ActSelInfSrcCrsInf (ActChgCrsSta + 61)
#define ActSelInfSrcTchGui (ActChgCrsSta + 62)
#define ActSelInfSrcSylLec (ActChgCrsSta + 63)
#define ActSelInfSrcSylPra (ActChgCrsSta + 64)
#define ActSelInfSrcBib (ActChgCrsSta + 65)
#define ActSelInfSrcFAQ (ActChgCrsSta + 66)
#define ActSelInfSrcCrsLnk (ActChgCrsSta + 67)
#define ActRcvURLCrsInf (ActChgCrsSta + 68)
#define ActRcvURLTchGui (ActChgCrsSta + 69)
#define ActRcvURLSylLec (ActChgCrsSta + 70)
#define ActRcvURLSylPra (ActChgCrsSta + 71)
#define ActRcvURLBib (ActChgCrsSta + 72)
#define ActRcvURLFAQ (ActChgCrsSta + 73)
#define ActRcvURLCrsLnk (ActChgCrsSta + 74)
#define ActRcvPagCrsInf (ActChgCrsSta + 75)
#define ActRcvPagTchGui (ActChgCrsSta + 76)
#define ActRcvPagSylLec (ActChgCrsSta + 77)
#define ActRcvPagSylPra (ActChgCrsSta + 78)
#define ActRcvPagBib (ActChgCrsSta + 79)
#define ActRcvPagFAQ (ActChgCrsSta + 80)
#define ActRcvPagCrsLnk (ActChgCrsSta + 81)
#define ActEditorCrsInf (ActChgCrsSta + 82)
#define ActEditorTchGui (ActChgCrsSta + 83)
#define ActEditorSylLec (ActChgCrsSta + 84)
#define ActEditorSylPra (ActChgCrsSta + 85)
#define ActEditorBib (ActChgCrsSta + 86)
#define ActEditorFAQ (ActChgCrsSta + 87)
#define ActEditorCrsLnk (ActChgCrsSta + 88)
#define ActPlaTxtEdiCrsInf (ActChgCrsSta + 89)
#define ActPlaTxtEdiTchGui (ActChgCrsSta + 90)
#define ActPlaTxtEdiSylLec (ActChgCrsSta + 91)
#define ActPlaTxtEdiSylPra (ActChgCrsSta + 92)
#define ActPlaTxtEdiBib (ActChgCrsSta + 93)
#define ActPlaTxtEdiFAQ (ActChgCrsSta + 94)
#define ActPlaTxtEdiCrsLnk (ActChgCrsSta + 95)
#define ActRchTxtEdiCrsInf (ActChgCrsSta + 96)
#define ActRchTxtEdiTchGui (ActChgCrsSta + 97)
#define ActRchTxtEdiSylLec (ActChgCrsSta + 98)
#define ActRchTxtEdiSylPra (ActChgCrsSta + 99)
#define ActRchTxtEdiBib (ActChgCrsSta + 100)
#define ActRchTxtEdiFAQ (ActChgCrsSta + 101)
#define ActRchTxtEdiCrsLnk (ActChgCrsSta + 102)
#define ActRcvPlaTxtCrsInf (ActChgCrsSta + 103)
#define ActRcvPlaTxtTchGui (ActChgCrsSta + 104)
#define ActRcvPlaTxtSylLec (ActChgCrsSta + 105)
#define ActRcvPlaTxtSylPra (ActChgCrsSta + 106)
#define ActRcvPlaTxtBib (ActChgCrsSta + 107)
#define ActRcvPlaTxtFAQ (ActChgCrsSta + 108)
#define ActRcvPlaTxtCrsLnk (ActChgCrsSta + 109)
#define ActRcvRchTxtCrsInf (ActChgCrsSta + 110)
#define ActRcvRchTxtTchGui (ActChgCrsSta + 111)
#define ActRcvRchTxtSylLec (ActChgCrsSta + 112)
#define ActRcvRchTxtSylPra (ActChgCrsSta + 113)
#define ActRcvRchTxtBib (ActChgCrsSta + 114)
#define ActRcvRchTxtFAQ (ActChgCrsSta + 115)
#define ActRcvRchTxtCrsLnk (ActChgCrsSta + 116)
#define ActPrnCrsTT (ActChgCrsSta + 108)
#define ActEdiCrsTT (ActChgCrsSta + 109)
#define ActChgCrsTT (ActChgCrsSta + 110)
#define ActChgCrsTT1stDay (ActChgCrsSta + 111)
#define ActPrnCrsTT (ActChgCrsSta + 117)
#define ActEdiCrsTT (ActChgCrsSta + 118)
#define ActChgCrsTT (ActChgCrsSta + 119)
#define ActChgCrsTT1stDay (ActChgCrsSta + 120)
/*****************************************************************************/
/***************************** Assessment tab ********************************/

View File

@ -520,6 +520,15 @@ Param
// TODO: Impedir la creación y edición de proyectos si no son editables.
// TODO: No se puede entrar con DNI '1' suponiendo que no tenga password ¿por qué?
// 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: Análisis > Informe: "Informe de uso de SWAD" sale descentrado
// TODO: Fig_GetAndShowCourseProgramStats
Version 19.130: Feb 20, 2020 New module swad_program. (281273 lines)
2 changes necessary in database:
CREATE TABLE IF NOT EXISTS prg_grp (PrgIteCod INT NOT NULL,GrpCod INT NOT NULL,UNIQUE INDEX(PrgIteCod,GrpCod));
CREATE TABLE IF NOT EXISTS prg_items (PrgIteCod INT NOT NULL AUTO_INCREMENT,CrsCod INT NOT NULL DEFAULT -1,Hidden ENUM('N','Y') NOT NULL DEFAULT 'N',UsrCod INT NOT NULL,StartTime DATETIME NOT NULL,EndTime DATETIME NOT NULL,Title VARCHAR(2047) NOT NULL,Txt TEXT NOT NULL,UNIQUE INDEX(PrgIteCod),INDEX(CrsCod,Hidden));
Version 19.129: Feb 20, 2020 New option for schedule in course. (279240 lines)
Copy the following icons to icon public directory:

View File

@ -2188,6 +2188,51 @@ mysql> DESCRIBE plugins;
"IP CHAR(15) NOT NULL," // Cns_MAX_BYTES_IP
"UNIQUE INDEX(PlgCod))");
/***** 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)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS prg_grp ("
"PrgIteCod INT NOT NULL,"
"GrpCod INT NOT NULL,"
"UNIQUE INDEX(PrgIteCod,GrpCod))");
/***** Table prg_items *****/
/*
mysql> DESCRIBE prg_items;
+-----------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+---------+----------------+
| PrgIteCod | int(11) | NO | PRI | NULL | auto_increment |
| CrsCod | int(11) | NO | MUL | -1 | |
| Hidden | enum('N','Y') | NO | | N | |
| UsrCod | int(11) | NO | | NULL | |
| StartTime | datetime | NO | | NULL | |
| EndTime | datetime | NO | | NULL | |
| Title | varchar(2047) | NO | | NULL | |
| Txt | text | NO | | NULL | |
+-----------+---------------+------+-----+---------+----------------+
8 rows in set (0.01 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS prg_items ("
"PrgIteCod INT NOT NULL AUTO_INCREMENT,"
"CrsCod INT NOT NULL DEFAULT -1,"
"Hidden ENUM('N','Y') NOT NULL DEFAULT 'N',"
"UsrCod INT NOT NULL,"
"StartTime DATETIME NOT NULL,"
"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),"
"INDEX(CrsCod,Hidden))");
/***** Table prj_config *****/
/*
mysql> DESCRIBE prj_config;

View File

@ -145,6 +145,8 @@ static void Fig_WriteRowStatsFileBrowsers3 (const char *NameOfFileZones,
static void Fig_GetAndShowOERsStats (void);
static void Fig_GetNumberOfOERsFromDB (Hie_Level_t Scope,Brw_License_t License,unsigned long NumFiles[2]);
static void Fig_GetAndShowCourseProgramStats (void); // TODO: Change function from assignments to schedule
static void Fig_GetAndShowAssignmentsStats (void);
static void Fig_GetAndShowProjectsStats (void);
static void Fig_GetAndShowTestsStats (void);
@ -315,6 +317,7 @@ void Fig_ShowFigures (void)
[Fig_DEGREE_TYPES ] = Fig_GetAndShowDegreeTypesStats,
[Fig_FOLDERS_AND_FILES] = Fig_GetAndShowFileBrowsersStats,
[Fig_OER ] = Fig_GetAndShowOERsStats,
[Fig_COURSE_PROGRAM ] = Fig_GetAndShowCourseProgramStats,
[Fig_ASSIGNMENTS ] = Fig_GetAndShowAssignmentsStats,
[Fig_PROJECTS ] = Fig_GetAndShowProjectsStats,
[Fig_TESTS ] = Fig_GetAndShowTestsStats,
@ -2936,6 +2939,68 @@ static void Fig_GetNumberOfOERsFromDB (Hie_Level_t Scope,Brw_License_t License,u
DB_FreeMySQLResult (&mysql_res);
}
/*****************************************************************************/
/********************** Show stats about schedule items **********************/
/*****************************************************************************/
static void Fig_GetAndShowCourseProgramStats (void) // TODO: Change function from assignments to course program items
{
extern const char *Hlp_ANALYTICS_Figures_assignments;
extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES];
extern const char *Txt_Number_of_BR_assignments;
extern const char *Txt_Number_of_BR_courses_with_BR_assignments;
extern const char *Txt_Average_number_BR_of_ASSIG_BR_per_course;
extern const char *Txt_Number_of_BR_notifications;
unsigned NumAssignments;
unsigned NumNotif;
unsigned NumCoursesWithAssignments = 0;
double NumAssignmentsPerCourse = 0.0;
/***** Get the number of assignments from this location *****/
if ((NumAssignments = Asg_GetNumAssignments (Gbl.Scope.Current,&NumNotif)))
if ((NumCoursesWithAssignments = Asg_GetNumCoursesWithAssignments (Gbl.Scope.Current)) != 0)
NumAssignmentsPerCourse = (double) NumAssignments /
(double) NumCoursesWithAssignments;
/***** Begin box and table *****/
Box_BoxTableBegin (NULL,Txt_FIGURE_TYPES[Fig_ASSIGNMENTS],NULL,
Hlp_ANALYTICS_Figures_assignments,Box_NOT_CLOSABLE,2);
/***** Write table heading *****/
HTM_TR_Begin (NULL);
HTM_TH (1,1,"RM",Txt_Number_of_BR_assignments);
HTM_TH (1,1,"RM",Txt_Number_of_BR_courses_with_BR_assignments);
HTM_TH (1,1,"RM",Txt_Average_number_BR_of_ASSIG_BR_per_course);
HTM_TH (1,1,"RM",Txt_Number_of_BR_notifications);
HTM_TR_End ();
/***** Write number of assignments *****/
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"DAT RM\"");
HTM_Unsigned (NumAssignments);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT RM\"");
HTM_Unsigned (NumCoursesWithAssignments);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT RM\"");
HTM_Double2Decimals (NumAssignmentsPerCourse);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT RM\"");
HTM_Unsigned (NumNotif);
HTM_TD_End ();
HTM_TR_End ();
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/
/************************ Show stats about assignments ***********************/
/*****************************************************************************/

View File

@ -31,7 +31,7 @@
/************************** Public types and constants ***********************/
/*****************************************************************************/
#define Fig_NUM_FIGURES 28
#define Fig_NUM_FIGURES 29
typedef enum
{
Fig_USERS, // Number of users
@ -41,6 +41,7 @@ typedef enum
Fig_DEGREE_TYPES, // Number of degrees in each type of degree
Fig_FOLDERS_AND_FILES, // Number of folders and files
Fig_OER, // Number of OERs (Open Educational Resources)
Fig_COURSE_PROGRAM, // Number of program items
Fig_ASSIGNMENTS, // Number of assignments
Fig_PROJECTS, // Number of projects
Fig_TESTS, // Number of test questions

View File

@ -44,6 +44,7 @@
#include "swad_global.h"
#include "swad_icon.h"
#include "swad_parameter.h"
#include "swad_program.h"
#include "swad_project.h"
#include "swad_role.h"
#include "swad_setting.h"
@ -296,6 +297,11 @@ void Gbl_InitializeGlobals (void)
Gbl.Search.Str[0] = '\0';
Gbl.Search.LogSearch = false;
Gbl.Prg.LstIsRead = false; // List is not read
Gbl.Prg.Num = 0;
Gbl.Prg.LstPrgIteCods = NULL;
Gbl.Prg.SelectedOrder = Prg_ORDER_DEFAULT;
Gbl.Asgs.LstIsRead = false; // List is not read
Gbl.Asgs.Num = 0;
Gbl.Asgs.LstAsgCods = NULL;

View File

@ -540,6 +540,15 @@ struct Globals
char TmpDir[NAME_MAX + 1];
} ZIP;
} FileBrowser; // Struct used for a file browser
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
Dat_StartEndTime_t SelectedOrder;
long PrgIteCodToEdit; // Used as parameter in contextual links
unsigned CurrentPage;
} Prg;
struct
{
bool LstIsRead; // Is the list already read from database, or it needs to be read?

View File

@ -778,6 +778,69 @@ const char *Hlp_COURSE_Information_edit =
"COURSE.Information.en#edit";
#endif
const char *Hlp_COURSE_Program =
#if L==1
"COURSE.Program.es";
#elif L==2
"COURSE.Program.en";
#elif L==3
"COURSE.Program.en";
#elif L==4
"COURSE.Program.es";
#elif L==5
"COURSE.Program.en";
#elif L==6
"COURSE.Program.es";
#elif L==7
"COURSE.Program.en";
#elif L==8
"COURSE.Program.en";
#elif L==9
"COURSE.Program.en";
#endif
const char *Hlp_COURSE_Program_new_item =
#if L==1
"COURSE.Program.es#nuevo-item";
#elif L==2
"COURSE.Program.en#new-item";
#elif L==3
"COURSE.Program.en#new-item";
#elif L==4
"COURSE.Program.es#nuevo-item";
#elif L==5
"COURSE.Program.en#new-item";
#elif L==6
"COURSE.Program.es#nuevo-item";
#elif L==7
"COURSE.Program.en#new-item";
#elif L==8
"COURSE.Program.en#new-item";
#elif L==9
"COURSE.Program.en#new-item";
#endif
const char *Hlp_COURSE_Program_edit_item =
#if L==1
"COURSE.Program.es#editar-item";
#elif L==2
"COURSE.Program.en#edit-item";
#elif L==3
"COURSE.Program.en#edit-item";
#elif L==4
"COURSE.Program.es#editar-item";
#elif L==5
"COURSE.Program.en#edit-item";
#elif L==6
"COURSE.Program.es#editar-item";
#elif L==7
"COURSE.Program.en#edit-item";
#elif L==8
"COURSE.Program.en#edit-item";
#elif L==9
"COURSE.Program.en#edit-item";
#endif
const char *Hlp_COURSE_Guide =
#if L==1
"COURSE.Guide.es";

View File

@ -101,7 +101,7 @@ static const Act_Action_t Mnu_MenuActions[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_
},
[TabCrs] = {
[ 0] = ActSeeCrsInf,
[ 1] = ActSeeScd,
[ 1] = ActSeePrg,
[ 2] = ActSeeTchGui,
[ 3] = ActSeeSyl,
[ 4] = ActSeeBib,

View File

@ -37,6 +37,7 @@
#include "swad_global.h"
#include "swad_HTML.h"
#include "swad_parameter.h"
#include "swad_program.h"
#include "swad_project.h"
/*****************************************************************************/
@ -53,6 +54,7 @@ extern const Act_Action_t For_ActionsSeePstFor[For_NUM_TYPES_FORUM];
static const char *Pag_ParamNumPag[Pag_NUM_WHAT_PAGINATE] =
{
[Pag_COURSE_PROGRAM ] = "NumPagPrg",
[Pag_ASSIGNMENTS ] = "NumPagAsg",
[Pag_PROJECTS ] = "NumPagPrj",
[Pag_GAMES ] = "NumPagGam",
@ -165,6 +167,12 @@ void Pag_WriteLinksToPages (Pag_WhatPaginate_t WhatPaginate,
{
switch (WhatPaginate)
{
case Pag_COURSE_PROGRAM:
Frm_StartFormAnchor (ActSeePrg,Pagination->Anchor);
Pag_PutHiddenParamPagNum (WhatPaginate,1);
Prg_PutHiddenParamPrgOrder ();
Grp_PutParamWhichGrps ();
break;
case Pag_ASSIGNMENTS:
Frm_StartFormAnchor (ActSeeAsg,Pagination->Anchor);
Pag_PutHiddenParamPagNum (WhatPaginate,1);
@ -279,6 +287,12 @@ void Pag_WriteLinksToPages (Pag_WhatPaginate_t WhatPaginate,
{
switch (WhatPaginate)
{
case Pag_COURSE_PROGRAM:
Frm_StartFormAnchor (ActSeePrg,Pagination->Anchor);
Pag_PutHiddenParamPagNum (WhatPaginate,1);
Prg_PutHiddenParamPrgOrder ();
Grp_PutParamWhichGrps ();
break;
case Pag_ASSIGNMENTS:
Frm_StartFormAnchor (ActSeeAsg,Pagination->Anchor);
Pag_PutHiddenParamPagNum (WhatPaginate,1);
@ -379,6 +393,12 @@ void Pag_WriteLinksToPages (Pag_WhatPaginate_t WhatPaginate,
{
switch (WhatPaginate)
{
case Pag_COURSE_PROGRAM:
Frm_StartFormAnchor (ActSeePrg,Pagination->Anchor);
Pag_PutHiddenParamPagNum (WhatPaginate,Pagination->LeftPage);
Prg_PutHiddenParamPrgOrder ();
Grp_PutParamWhichGrps ();
break;
case Pag_ASSIGNMENTS:
Frm_StartFormAnchor (ActSeeAsg,Pagination->Anchor);
Pag_PutHiddenParamPagNum (WhatPaginate,Pagination->LeftPage);
@ -491,6 +511,12 @@ void Pag_WriteLinksToPages (Pag_WhatPaginate_t WhatPaginate,
{
switch (WhatPaginate)
{
case Pag_COURSE_PROGRAM:
Frm_StartFormAnchor (ActSeePrg,Pagination->Anchor);
Pag_PutHiddenParamPagNum (WhatPaginate,NumPage);
Prg_PutHiddenParamPrgOrder ();
Grp_PutParamWhichGrps ();
break;
case Pag_ASSIGNMENTS:
Frm_StartFormAnchor (ActSeeAsg,Pagination->Anchor);
Pag_PutHiddenParamPagNum (WhatPaginate,NumPage);
@ -590,6 +616,12 @@ void Pag_WriteLinksToPages (Pag_WhatPaginate_t WhatPaginate,
}
switch (WhatPaginate)
{
case Pag_COURSE_PROGRAM:
Frm_StartFormAnchor (ActSeePrg,Pagination->Anchor);
Pag_PutHiddenParamPagNum (WhatPaginate,Pagination->RightPage);
Prg_PutHiddenParamPrgOrder ();
Grp_PutParamWhichGrps ();
break;
case Pag_ASSIGNMENTS:
Frm_StartFormAnchor (ActSeeAsg,Pagination->Anchor);
Pag_PutHiddenParamPagNum (WhatPaginate,Pagination->RightPage);
@ -690,6 +722,12 @@ void Pag_WriteLinksToPages (Pag_WhatPaginate_t WhatPaginate,
}
switch (WhatPaginate)
{
case Pag_COURSE_PROGRAM:
Frm_StartFormAnchor (ActSeePrg,Pagination->Anchor);
Pag_PutHiddenParamPagNum (WhatPaginate,Pagination->NumPags);
Prg_PutHiddenParamPrgOrder ();
Grp_PutParamWhichGrps ();
break;
case Pag_ASSIGNMENTS:
Frm_StartFormAnchor (ActSeeAsg,Pagination->Anchor);
Pag_PutHiddenParamPagNum (WhatPaginate,Pagination->NumPags);

View File

@ -37,20 +37,21 @@
/******************************** Public types *******************************/
/*****************************************************************************/
#define Pag_NUM_WHAT_PAGINATE 11
#define Pag_NUM_WHAT_PAGINATE 12
typedef enum
{
Pag_ASSIGNMENTS = 0,
Pag_PROJECTS = 1,
Pag_GAMES = 2,
Pag_SURVEYS = 3,
Pag_ATT_EVENTS = 4,
Pag_THREADS_FORUM = 5,
Pag_POSTS_FORUM = 6,
Pag_MESSAGES_RECEIVED = 7,
Pag_MESSAGES_SENT = 8,
Pag_MY_AGENDA = 9,
Pag_ANOTHER_AGENDA = 10,
Pag_COURSE_PROGRAM = 0,
Pag_ASSIGNMENTS = 1,
Pag_PROJECTS = 2,
Pag_GAMES = 3,
Pag_SURVEYS = 4,
Pag_ATT_EVENTS = 5,
Pag_THREADS_FORUM = 6,
Pag_POSTS_FORUM = 7,
Pag_MESSAGES_RECEIVED = 8,
Pag_MESSAGES_SENT = 9,
Pag_MY_AGENDA = 10,
Pag_ANOTHER_AGENDA = 11,
} Pag_WhatPaginate_t;
struct Pagination // Used for threads and messages pagination

1701
swad_program.c Normal file

File diff suppressed because it is too large Load Diff

90
swad_program.h Normal file
View File

@ -0,0 +1,90 @@
// swad_program.h: course program
#ifndef _SWAD_PRG
#define _SWAD_PRG
/*
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-2020 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 <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
#include "swad_date.h"
#include "swad_file_browser.h"
#include "swad_notification.h"
#include "swad_user.h"
/*****************************************************************************/
/************************** Public types and constants ***********************/
/*****************************************************************************/
#define Prg_MAX_CHARS_PROGRAM_ITEM_TITLE (128 - 1) // 127
#define Prg_MAX_BYTES_PROGRAM_ITEM_TITLE ((Prg_MAX_CHARS_PROGRAM_ITEM_TITLE + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
struct ProgramItem
{
long PrgIteCod;
bool Hidden;
long UsrCod;
time_t TimeUTC[Dat_NUM_START_END_TIME];
bool Open;
char Title[Prg_MAX_BYTES_PROGRAM_ITEM_TITLE + 1];
bool IBelongToCrsOrGrps; // I can do this program item
// (it is associated to no groups
// or, if associated to groups,
// I belong to any of the groups)
};
#define Prg_ORDER_DEFAULT Dat_START_TIME
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/
void Prg_SeeCourseProgram (void);
void Prg_PrintOnePrgItem (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_GetNotifPrgItem (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
char **ContentStr,
long PrgIteCod,bool GetContent);
long Prg_GetParamPrgItemCod (void);
void Prg_ReqRemPrgItem (void);
void Prg_RemovePrgItem (void);
void Prg_HidePrgItem (void);
void Prg_ShowPrgItem (void);
void Prg_RecFormPrgItem (void);
bool Prg_CheckIfPrgItemIsAssociatedToGrp (long PrgIteCod,long GrpCod);
void Prg_RemoveGroup (long GrpCod);
void Prg_RemoveGroupsOfType (long GrpTypCod);
void Prg_RemoveCrsPrgItems (long CrsCod);
unsigned Prg_GetNumPrgItemsInCrs(long CrsCod);
unsigned Prg_GetNumCoursesWithPrgItems (Hie_Level_t Scope);
unsigned Prg_GetNumPrgItems (Hie_Level_t Scope,unsigned *NumNotif);
#endif

View File

@ -1506,6 +1506,27 @@ const char *Txt_Already_existed_an_event_with_the_title_X = // Warning: it is ve
"J&aacute; existe um evento com o t&iacute;tulo <strong>%s</strong>.";
#endif
const char *Txt_Already_existed_an_item_with_the_title_X = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"Ja existia un &iacute;tem amb el t&iacute;tol <strong>%s</strong>.";
#elif L==2 // de
"Es gibt bereits einen Artikel mit dem Namen <strong>%s</strong>.";
#elif L==3 // en
"Already existed an item with the title <strong>%s</strong>.";
#elif L==4 // es
"Ya exist&iacute;a un &iacute;tem con el t&iacute;tulo <strong>%s</strong>.";
#elif L==5 // fr
"Il existe d&eacute;j&agrave; un article du titre <strong>%s</strong>.";
#elif L==6 // gn
"Ya exist&iacute;a un &iacute;tem con el t&iacute;tulo <strong>%s</strong>."; // Okoteve traducción
#elif L==7 // it
"Esiste gi&agrave; un articolo con il titolo <strong>%s</strong>.";
#elif L==8 // pl
"Istniala juz przedmiot z tytulu <strong>%s</strong>.";
#elif L==9 // pt
"J&aacute; existe um item com o t&iacute;tulo <strong>%s</strong>.";
#endif
const char *Txt_Altitude =
#if L==1 // ca
"Altitud";
@ -5182,6 +5203,27 @@ const char *Txt_course =
"disciplina";
#endif
const char *Txt_Course_program =
#if L==1 // ca
"Programa de l'assignatura";
#elif L==2 // de
"Kursprogramm";
#elif L==3 // en
"Course program";
#elif L==4 // es
"Programa de la asignatura";
#elif L==5 // fr
"Programme de la mati&egrave;re";
#elif L==6 // gn
"Programa de la asignatura"; // Okoteve traducción
#elif L==7 // it
"Programma del corso";
#elif L==8 // pl
"Program kursu";
#elif L==9 // pt
"Programa da disciplina";
#endif
const char *Txt_COURSE_STATUS[Crs_NUM_STATUS_TXT] =
{
[Crs_STATUS_UNKNOWN] =
@ -5941,6 +5983,27 @@ const char *Txt_Create_institution =
"Criar institu&ccedil;&atilde;o";
#endif
const char *Txt_Create_item =
#if L==1 // ca
"Crear &iacute;tem";
#elif L==2 // de
"Artikel eingeben";
#elif L==3 // en
"Create item";
#elif L==4 // es
"Crear &iacute;tem";
#elif L==5 // fr
"Cr&eacute;er article";
#elif L==6 // gn
"Crear &iacute;tem"; // Okoteve traducción
#elif L==7 // it
"Crea articolo";
#elif L==8 // pl
"Utw&oacute;rz przedmiot";
#elif L==9 // pt
"Criar item";
#endif
const char *Txt_Create_link =
#if L==1 // ca
"Crear enlla&ccedil;";
@ -6529,6 +6592,27 @@ const char *Txt_Created_new_institution_X = // Warning: it is very important to
"Criada nova institu&ccedil;&atilde;o <strong>%s</strong>.";
#endif
const char *Txt_Created_new_item_X = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"Creado nuevo &iacute;tem <strong>%s</strong>."; // Necessita traduccio
#elif L==2 // de
"Neue Artikel <strong>%s</strong> eingegeben.";
#elif L==3 // en
"Created new item <strong>%s</strong>.";
#elif L==4 // es
"Creado nuevo &iacute;tem <strong>%s</strong>.";
#elif L==5 // fr
"Cr&eacute;&eacute;e nouvel article <strong>%s</strong>.";
#elif L==6 // gn
"Creado nuevo &iacute;tem <strong>%s</strong>."; // Okoteve traducción
#elif L==7 // it
"Creato nuovo articolo <strong>%s</strong>.";
#elif L==8 // pl
"Utworzono nowa przedmiot <strong>%s</strong>.";
#elif L==9 // pt
"Criado novo item <strong>%s</strong>.";
#endif
const char *Txt_Created_new_link_X = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"Creado nuevo enlace <strong>%s</strong>."; // Necessita traduccio
@ -9080,6 +9164,27 @@ const char *Txt_Do_you_really_want_to_remove_the_group_X_Y_students_ = // Warnin
"Ao fazer isso, voc&ecirc; remover&aacute; %u estudantes desse grupo.";
#endif
const char *Txt_Do_you_really_want_to_remove_the_item_X = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"De veres voleu eliminar l'&iacute;tem <strong>%s</strong>?";
#elif L==2 // de
"Wollen Sie die Artikel <strong>%s</strong> wirklich entfernen?";
#elif L==3 // en
"Do you really want to remove the item <strong>%s</strong>?";
#elif L==4 // es
"&iquest;Realmente desea eliminar el &iacute;tem <strong>%s</strong>?";
#elif L==5 // fr
"Voulez-vous vraiment supprimer l'article <strong>%s</strong>?";
#elif L==6 // gn
"&iquest;Realmente desea eliminar el &iacute;tem <strong>%s</strong>?"; // Okoteve traducción
#elif L==7 // it
"Vuoi realmente rimuovere il articolo <strong>%s</strong>?";
#elif L==8 // pl
"Czy na pewno chcesz usunac przedmiot <strong>%s</strong>?";
#elif L==9 // pt
"Voc&ecirc; realmente deseja remover o item <strong>%s</strong>?";
#endif
const char *Txt_Do_you_really_want_to_remove_the_match_X = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"De veres voleu eliminar la partida <strong>%s</strong>?";
@ -9145,7 +9250,7 @@ const char *Txt_Do_you_really_want_to_remove_the_project_X = // Warning: it is v
const char *Txt_Do_you_really_want_to_remove_the_question_X = // Warning: it is very important to include %ld in the following sentences
#if L==1 // ca
"De veres voleu eliminar pregunta <strong>%ld</strong>?";
"De veres voleu eliminar la pregunta <strong>%ld</strong>?";
#elif L==2 // de
"Wollen Sie die Frage <strong>%ld</strong> wirklich entfernen?";
#elif L==3 // en
@ -9896,6 +10001,27 @@ const char *Txt_Edit_game =
"Editar jogo";
#endif
const char *Txt_Edit_item =
#if L==1 // ca
"Editar &iacute;tem";
#elif L==2 // de
"Artikel bearbeiten";
#elif L==3 // en
"Edit item";
#elif L==4 // es
"Editar &iacute;tem";
#elif L==5 // fr
"&Eacute;diter article";
#elif L==6 // gn
"Editar &iacute;tem"; // Okoteve traducción
#elif L==7 // it
"Editare articolo";
#elif L==8 // pl
"Edycja przedmiot";
#elif L==9 // pt
"Editar item";
#endif
const char *Txt_Edit_my_personal_data =
#if L==1 // ca
"Edita meves dades personals";
@ -15912,7 +16038,7 @@ const char *Txt_INFO_TITLE[Inf_NUM_INFO_TYPES] =
#elif L==2 // de
"Studienplan (Vorlesungen)"
#elif L==3 // en
"Syllabus (lectures)"
"Topics (lectures)"
#elif L==4 // es
"Temario teor&iacute;a"
#elif L==5 // fr
@ -15933,7 +16059,7 @@ const char *Txt_INFO_TITLE[Inf_NUM_INFO_TYPES] =
#elif L==2 // de
"Studienplan (&Uuml;bungen)"
#elif L==3 // en
"Syllabus (practicals)"
"Topics (practicals)"
#elif L==4 // es
"Temario pr&aacute;cticas"
#elif L==5 // fr
@ -17083,6 +17209,27 @@ const char *Txt_It_is_optional_to_choose_a_group =
"Escolher um grupo &eacute; volunt&aacute;rio";
#endif
const char *Txt_Item =
#if L==1 // ca
"&Iacute;tem";
#elif L==2 // de
"Artikel";
#elif L==3 // en
"Item";
#elif L==4 // es
"&Iacute;tem";
#elif L==5 // fr
"Article";
#elif L==6 // gn
"&Iacute;tem"; // Okoteve traducción
#elif L==7 // it
"Articolo";
#elif L==8 // pl
"Pozycja";
#elif L==9 // pt
"Item";
#endif
const char *Txt_Its_me =
#if L==1 // ca
"S&oacute;c jo!";
@ -19223,13 +19370,13 @@ const char *Txt_MENU_TITLE[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB] =
"Informa&ccedil;&atilde;o"
#endif
,
// 1: ActSeeScd
// 1: ActSeePrg
#if L==1 // ca
"Programa"
#elif L==2 // de
"Programm"
#elif L==3 // en
"Schedule"
"Program"
#elif L==4 // es
"Programa"
#elif L==5 // fr
@ -19271,7 +19418,7 @@ const char *Txt_MENU_TITLE[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB] =
#elif L==2 // de
"Studienplan"
#elif L==3 // en
"Syllabus"
"Topics"
#elif L==4 // es
"Temario"
#elif L==5 // fr
@ -21079,7 +21226,7 @@ const char *Txt_MENU_SUBTITLE[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB] =
"Informa&ccedil;&atilde;o desta disciplina"
#endif
,
// 1: ActSeeScd
// 1: ActSeePrg
#if L==1 // ca
"Programaci&oacute; did&agrave;ctica de l'assignatura"
#elif L==2 // de
@ -21127,7 +21274,7 @@ const char *Txt_MENU_SUBTITLE[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB] =
#elif L==2 // de
"Studienplan"
#elif L==3 // en
"Syllabus"
"Topics"
#elif L==4 // es
"Temario de la asignatura"
#elif L==5 // fr
@ -24463,6 +24610,27 @@ const char *Txt_New_institution =
"Nova institu&ccedil;&atilde;o (universidade, faculdade, escola, academia, organiza&ccedil;&atilde;o, empresa...)";
#endif
const char *Txt_New_item =
#if L==1 // ca
"Nou &iacute;tem";
#elif L==2 // de
"Neuer Artikel";
#elif L==3 // en
"New item";
#elif L==4 // es
"Nuevo &iacute;tem";
#elif L==5 // fr
"Nouvel article";
#elif L==6 // gn
"Nuevo &iacute;tem"; // Okoteve traducción
#elif L==7 // it
"Nuovo articolo";
#elif L==8 // pl
"Nowa pozycja";
#elif L==9 // pt
"Novo item";
#endif
const char *Txt_New_link =
#if L==1 // ca
"Nuevo enlace"; // Necessita traduccio
@ -25510,6 +25678,27 @@ const char *Txt_No_institutions =
"N&atilde;o h&aacute; institu&ccedil;&otilde;es.";
#endif
const char *Txt_No_items =
#if L==1 // ca
"No hi ha items";
#elif L==2 // de
"Keine Artikel";
#elif L==3 // en
"No items";
#elif L==4 // es
"No hay items";
#elif L==5 // fr
"Il n'y a pas d'articles";
#elif L==6 // gn
"No hay items"; // Okoteve traducción
#elif L==7 // it
"Non ci sono articoli";
#elif L==8 // pl
"Brak przedmiot&oacute;w";
#elif L==9 // pt
"N&atilde;o h&aacute; itens";
#endif
const char *Txt_No_links =
#if L==1 // ca
"No hi ha enlla&ccedil;os.";
@ -32859,6 +33048,27 @@ const char *Txt_Remove_group =
"Remover grupo";
#endif
const char *Txt_Remove_item =
#if L==1 // ca
"Eliminar &iacute;tem";
#elif L==2 // de
"Entfernen Artikel";
#elif L==3 // en
"Remove item";
#elif L==4 // es
"Eliminar &iacute;tem";
#elif L==5 // fr
"Supprimer article";
#elif L==6 // gn
"Eliminar &iacute;tem"; // Okoteve traducción
#elif L==7 // it
"Rimuovere articolo";
#elif L==8 // pl
"Usu&nacute; przedmiot";
#elif L==9 // pt
"Remover item";
#endif
const char *Txt_Remove_link =
#if L==1 // ca
"Eliminar enlla&ccedil;";
@ -41681,6 +41891,27 @@ const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES] =
"Otwarte Zasoby Edukacyjne (OER)"
#elif L==9 // pt
"Recursos Educacionais Abertos (OER)"
#endif
,
[Fig_COURSE_PROGRAM] =
#if L==1 // ca
"Programa"
#elif L==2 // de
"Programm"
#elif L==3 // en
"Program"
#elif L==4 // es
"Programa"
#elif L==5 // fr
"Programme"
#elif L==6 // gn
"Programa" // Okoteve traducción
#elif L==7 // it
"Programma"
#elif L==8 // pl
"Program"
#elif L==9 // pt
"Programa"
#endif
,
[Fig_ASSIGNMENTS] =
@ -45894,6 +46125,27 @@ const char *Txt_The_integrated_editor_is_not_yet_available =
"O editor integrado ainda n&atilde;o est&aacute; dispon&iacute;vel.";
#endif
const char *Txt_The_item_has_been_modified =
#if L==1 // ca
"El &iacute;tem ha estat modificat.";
#elif L==2 // de
"Das Artikel wurde ge&auml;ndert.";
#elif L==3 // en
"The item has been modified.";
#elif L==4 // es
"El &iacute;tem ha sido modificado.";
#elif L==5 // fr
"L'article a &eacute;t&eacute; modifi&eacute;.";
#elif L==6 // gn
"El &iacute;tem ha sido modificado."; // Okoteve traducción
#elif L==7 // it
"Il articolo &egrave; stato modificato.";
#elif L==8 // pl
"Gra przedmiot zmodyfikowane.";
#elif L==9 // pt
"O item foi modificado.";
#endif
const char *Txt_The_link_X_already_exists = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"El enlace <strong>%s</strong> ya existe."; // Necessita traduccio
@ -56821,6 +57073,27 @@ const char *Txt_You_must_specify_the_title_of_the_game =
"Voc&ecirc; deve especificar o t&iacute;tulo do jogo.";
#endif
const char *Txt_You_must_specify_the_title_of_the_item =
#if L==1 // ca
"Cal especificar el t&iacute;tol del &iacute;tem.";
#elif L==2 // de
"Die Artikel muss angegeben werden.";
#elif L==3 // en
"You must specify the title of the item.";
#elif L==4 // es
"Debe especificar el t&iacute;tulo del &iacute;tem.";
#elif L==5 // fr
"Vous devez sp&eacute;cifier le titre du article.";
#elif L==6 // gn
"Debe especificar el t&iacute;tulo del &iacute;tem."; // Okoteve traducción
#elif L==7 // it
"&Egrave; necessario specificare il titolo del articolo.";
#elif L==8 // pl
"Musisz poda&cacute; tytu&lstrok; przedmiot.";
#elif L==9 // pt
"Voc&ecirc; deve especificar o t&iacute;tulo do item.";
#endif
const char *Txt_You_must_specify_the_title_of_the_project =
#if L==1 // ca
"Cal especificar el t&iacute;tol del projecte.";

View File

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