diff --git a/sql/swad.sql b/sql/swad.sql index 75fa27cd..9ee8a8ef 100644 --- a/sql/swad.sql +++ b/sql/swad.sql @@ -1037,6 +1037,7 @@ CREATE TABLE IF NOT EXISTS prg_grp ( CREATE TABLE IF NOT EXISTS prg_items ( ItmCod INT NOT NULL AUTO_INCREMENT, ItmInd INT NOT NULL DEFAULT 0, + Level INT NOT NULL DEFAULT 1, CrsCod INT NOT NULL DEFAULT -1, Hidden ENUM('N','Y') NOT NULL DEFAULT 'N', UsrCod INT NOT NULL, diff --git a/swad_API.c b/swad_API.c index 2267577d..2b45f79a 100644 --- a/swad_API.c +++ b/swad_API.c @@ -5093,7 +5093,7 @@ int swad__getMatches (struct soap *soap, Length); /* Get current question index (row[5]) */ - getMatchesOut->matchesArray.__ptr[NumMatch].questionIndex = (int) Gam_GetQstIndFromStr (row[5]); + getMatchesOut->matchesArray.__ptr[NumMatch].questionIndex = (int) Str_ConvertStrToUnsigned (row[5]); /* Get list of groups for this match */ API_GetListGrpsInGameFromDB (soap, diff --git a/swad_action.c b/swad_action.c index e2f7d858..df31826a 100644 --- a/swad_action.c +++ b/swad_action.c @@ -408,6 +408,8 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = [ActShoPrgItm ] = {1830,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_ShowPrgItem ,NULL}, [ActUp_PrgItm ] = {1831,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_MoveUpPrgItem ,NULL}, [ActDwnPrgItm ] = {1832,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_MoveDownPrgItem ,NULL}, + [ActRgtPrgItm ] = {1833,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_MoveRightPrgItem ,NULL}, + [ActLftPrgItm ] = {1834,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_MoveLeftPrgItem ,NULL}, [ActEdiTchGui ] = { 785,-1,TabUnk,ActSeeTchGui ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Inf_FormsToSelSendInfo ,NULL}, @@ -3560,6 +3562,8 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un ActShoPrgItm, // #1830 ActUp_PrgItm, // #1832 ActDwnPrgItm, // #1833 + ActRgtPrgItm, // #1833 + ActLftPrgItm, // #1834 }; /*****************************************************************************/ diff --git a/swad_action.h b/swad_action.h index 38165ec8..eab49fe0 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 1832 +#define Act_MAX_ACTION_COD 1834 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13 @@ -394,107 +394,109 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to #define ActShoPrgItm (ActChgCrsSta + 23) #define ActUp_PrgItm (ActChgCrsSta + 24) #define ActDwnPrgItm (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 ActRgtPrgItm (ActChgCrsSta + 26) +#define ActLftPrgItm (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 ActEdiBib (ActChgCrsSta + 45) -#define ActEdiFAQ (ActChgCrsSta + 46) -#define ActEdiCrsLnk (ActChgCrsSta + 47) +#define ActEdiBib (ActChgCrsSta + 47) +#define ActEdiFAQ (ActChgCrsSta + 48) +#define ActEdiCrsLnk (ActChgCrsSta + 49) -#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 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 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 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 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 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 ActPrnCrsTT (ActChgCrsSta + 118) -#define ActEdiCrsTT (ActChgCrsSta + 119) -#define ActChgCrsTT (ActChgCrsSta + 120) -#define ActChgCrsTT1stDay (ActChgCrsSta + 121) +#define ActPrnCrsTT (ActChgCrsSta + 120) +#define ActEdiCrsTT (ActChgCrsSta + 121) +#define ActChgCrsTT (ActChgCrsSta + 122) +#define ActChgCrsTT1stDay (ActChgCrsSta + 123) /*****************************************************************************/ /***************************** Assessment tab ********************************/ diff --git a/swad_changelog.h b/swad_changelog.h index 0e97800b..a6974623 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.134.4 (2020-02-26)" +#define Log_PLATFORM_VERSION "SWAD 19.135 (2020-02-27)" #define CSS_FILE "swad19.133.1.css" #define JS_FILE "swad19.91.1.js" /* @@ -523,6 +523,10 @@ Param // 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 + Version 19.135: Feb 27, 2020 Buttons in course program to indent items. Not finished. (282097 lines) + 1 change necessary in database: +ALTER TABLE prg_items ADD COLUMN Level INT NOT NULL DEFAULT 1 AFTER ItmInd; + Version 19.134.4: Feb 26, 2020 Changes in course program. (281992 lines) Version 19.134.3: Feb 26, 2020 Heading of course program table removed. (282008 lines) Version 19.134.2: Feb 26, 2020 Fixed bug in syllabus editor. (282021 lines) diff --git a/swad_database.c b/swad_database.c index d5508379..d4e9eea9 100644 --- a/swad_database.c +++ b/swad_database.c @@ -2212,6 +2212,7 @@ mysql> DESCRIBE prg_items; +-----------+---------------+------+-----+---------+----------------+ | ItmCod | int(11) | NO | PRI | NULL | auto_increment | | ItmInd | int(11) | NO | | 0 | | +| Level | int(11) | NO | | 1 | | | CrsCod | int(11) | NO | MUL | -1 | | | Hidden | enum('N','Y') | NO | | N | | | UsrCod | int(11) | NO | | NULL | | @@ -2220,11 +2221,12 @@ mysql> DESCRIBE prg_items; | Title | varchar(2047) | NO | | NULL | | | Txt | text | NO | | NULL | | +-----------+---------------+------+-----+---------+----------------+ -9 rows in set (0.01 sec) +10 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS prg_items (" "ItmCod INT NOT NULL AUTO_INCREMENT," "ItmInd INT NOT NULL DEFAULT 0," + "Level INT NOT NULL DEFAULT 1," "CrsCod INT NOT NULL DEFAULT -1," "Hidden ENUM('N','Y') NOT NULL DEFAULT 'N'," "UsrCod INT NOT NULL," diff --git a/swad_game.c b/swad_game.c index 171170bf..4032628f 100644 --- a/swad_game.c +++ b/swad_game.c @@ -1629,19 +1629,6 @@ unsigned Gam_GetParamQstInd (void) return (unsigned) QstInd; } -/*****************************************************************************/ -/******************* Get parameter with index of question ********************/ -/*****************************************************************************/ - -unsigned Gam_GetQstIndFromStr (const char *UnsignedStr) - { - long QstInd; - - QstInd = Str_ConvertStrCodToLongCod (UnsignedStr); - return (QstInd > 0) ? (unsigned) QstInd : - 0; - } - /*****************************************************************************/ /********************** Remove answers of a game question ********************/ /*****************************************************************************/ @@ -1893,7 +1880,7 @@ static void Gam_ListOneOrMoreQuestionsForEdition (long GamCod,unsigned NumQsts, Tst_QstConstructor (); /* Get question index (row[0]) */ - QstInd = Gam_GetQstIndFromStr (row[0]); + QstInd = Str_ConvertStrToUnsigned (row[0]); snprintf (StrQstInd,sizeof (StrQstInd), "%u", QstInd); diff --git a/swad_game.h b/swad_game.h index 84b13497..e9a9744f 100644 --- a/swad_game.h +++ b/swad_game.h @@ -121,7 +121,6 @@ void Gam_ListTstQuestionsToSelect (void); void Gam_PutParamQstInd (unsigned QstInd); unsigned Gam_GetParamQstInd (void); -unsigned Gam_GetQstIndFromStr (const char *UnsignedStr); long Gam_GetQstCodFromQstInd (long GamCod,unsigned QstInd); unsigned Gam_GetPrevQuestionIndexInGame (long GamCod,unsigned QstInd); unsigned Gam_GetNextQuestionIndexInGame (long GamCod,unsigned QstInd); diff --git a/swad_match.c b/swad_match.c index 06094253..a549a235 100644 --- a/swad_match.c +++ b/swad_match.c @@ -909,7 +909,7 @@ static void Mch_GetMatchDataFromRow (MYSQL_RES *mysql_res, row[12] ShowUsrResults */ /* Current question index (row[6]) */ - Match->Status.QstInd = Gam_GetQstIndFromStr (row[6]); + Match->Status.QstInd = Str_ConvertStrToUnsigned (row[6]); /* Current question code (row[7]) */ Match->Status.QstCod = Str_ConvertStrCodToLongCod (row[7]); diff --git a/swad_program.c b/swad_program.c index 7d0024d9..540de351 100644 --- a/swad_program.c +++ b/swad_program.c @@ -78,12 +78,10 @@ static void Prg_PutIconsListItems (void); static void Prg_PutIconToCreateNewItem (void); static void Prg_PutButtonToCreateNewItem (void); static void Prg_ParamsWhichGroupsToShow (void); -static void Prg_ShowOneItem (long ItmCod, - unsigned ItmInd,unsigned MaxItmInd, - bool PrintView); +static void Prg_ShowOneItem (long ItmCod,unsigned MaxItmInd,bool PrintView); static void Prg_PutFormsToRemEditOnePrgItem (const struct ProgramItem *Item, - unsigned ItmInd,unsigned MaxItmInd, + unsigned MaxItmInd, const char *Anchor); static void Prg_SetCurrentItmCod (long ItmCod); @@ -97,7 +95,6 @@ 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); @@ -180,7 +177,7 @@ static void Prg_ShowAllItems (void) NumItem <= Pagination.LastItemVisible; NumItem++) Prg_ShowOneItem (Gbl.Prg.LstItmCods[NumItem - 1], - NumItem,Gbl.Prg.Num, + Gbl.Prg.Num, false); // Not print view /***** End table *****/ @@ -274,9 +271,7 @@ static void Prg_ParamsWhichGroupsToShow (void) /************************** Show one program item ****************************/ /*****************************************************************************/ -static void Prg_ShowOneItem (long ItmCod, - unsigned ItmInd,unsigned MaxItmInd, - bool PrintView) +static void Prg_ShowOneItem (long ItmCod,unsigned MaxItmInd,bool PrintView) { char *Anchor = NULL; static unsigned UniqueId = 0; @@ -299,9 +294,7 @@ static void Prg_ShowOneItem (long ItmCod, if (!PrintView) { HTM_TD_Begin ("rowspan=\"2\" class=\"LT COLOR%u\"",Gbl.RowEvenOdd); - Prg_PutFormsToRemEditOnePrgItem (&Item, - ItmInd,MaxItmInd, - Anchor); + Prg_PutFormsToRemEditOnePrgItem (&Item,MaxItmInd,Anchor); HTM_TD_End (); } @@ -386,12 +379,15 @@ static void Prg_ShowOneItem (long ItmCod, /*****************************************************************************/ static void Prg_PutFormsToRemEditOnePrgItem (const struct ProgramItem *Item, - unsigned ItmInd,unsigned MaxItmInd, + unsigned MaxItmInd, const char *Anchor) { extern const char *Txt_Move_up_X; extern const char *Txt_Move_down_X; + extern const char *Txt_Increase_level_of_X; + extern const char *Txt_Decrease_level_of_X; extern const char *Txt_Movement_not_allowed; + static unsigned LastLevel = 0; char StrItemIndex[Cns_MAX_DECIMAL_DIGITS_UINT + 1]; Prg_SetCurrentItmCod (Item->ItmCod); // Used as parameter in contextual links @@ -400,7 +396,7 @@ static void Prg_PutFormsToRemEditOnePrgItem (const struct ProgramItem *Item, /***** Initialize item index string *****/ snprintf (StrItemIndex,sizeof (StrItemIndex), "%u", - ItmInd); + Item->ItmInd); switch (Gbl.Usrs.Me.Role.Logged) { @@ -418,8 +414,10 @@ static void Prg_PutFormsToRemEditOnePrgItem (const struct ProgramItem *Item, /***** Put form to edit program item *****/ Ico_PutContextualIconToEdit (ActEdiOnePrgItm,Prg_PutParams); + HTM_BR (); + /***** Put icon to move up the item *****/ - if (ItmInd > 1) + if (Item->ItmInd > 1) { Lay_PutContextualLinkOnlyIcon (ActUp_PrgItm,NULL,Prg_PutParams, "arrow-up.svg", @@ -431,7 +429,7 @@ static void Prg_PutFormsToRemEditOnePrgItem (const struct ProgramItem *Item, Ico_PutIconOff ("arrow-up.svg",Txt_Movement_not_allowed); /***** Put icon to move down the item *****/ - if (ItmInd < MaxItmInd) + if (Item->ItmInd < MaxItmInd) { Lay_PutContextualLinkOnlyIcon (ActDwnPrgItm,NULL,Prg_PutParams, "arrow-down.svg", @@ -441,6 +439,34 @@ static void Prg_PutFormsToRemEditOnePrgItem (const struct ProgramItem *Item, } else Ico_PutIconOff ("arrow-down.svg",Txt_Movement_not_allowed); + + HTM_BR (); + + /***** Icon to increase the level of an item *****/ + if (Item->Level > 1) + { + Lay_PutContextualLinkOnlyIcon (ActRgtPrgItm,NULL,Prg_PutParams, + "arrow-left.svg", + Str_BuildStringStr (Txt_Increase_level_of_X, + StrItemIndex)); + Str_FreeString (); + } + else + Ico_PutIconOff ("arrow-left.svg",Txt_Movement_not_allowed); + + /***** Icon to decrease level item *****/ + if (Item->Level < LastLevel + 1) + { + Lay_PutContextualLinkOnlyIcon (ActLftPrgItm,NULL,Prg_PutParams, + "arrow-right.svg", + Str_BuildStringStr (Txt_Decrease_level_of_X, + StrItemIndex)); + Str_FreeString (); + } + else + Ico_PutIconOff ("arrow-right.svg",Txt_Movement_not_allowed); + + LastLevel = Item->Level; break; case Rol_STD: case Rol_NET: @@ -610,12 +636,13 @@ void Prg_GetDataOfItemByCod (struct ProgramItem *Item) NumRows = DB_QuerySELECT (&mysql_res,"can not get program item data", "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] + "Level," // row[2] + "Hidden," // row[3] + "UsrCod," // row[4] + "UNIX_TIMESTAMP(StartTime)," // row[5] + "UNIX_TIMESTAMP(EndTime)," // row[6] + "NOW() BETWEEN StartTime AND EndTime," // row[7] + "Title" // row[8] " FROM prg_items" " WHERE ItmCod=%ld AND CrsCod=%ld", Item->ItmCod,Gbl.Hierarchy.Crs.CrsCod); @@ -649,37 +676,41 @@ static void Prg_GetDataOfItem (struct ProgramItem *Item, /* 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] + Level row[2] + Hidden row[3] + UsrCod row[4] + UNIX_TIMESTAMP(StartTime) row[5] + UNIX_TIMESTAMP(EndTime) row[6] + NOW() BETWEEN StartTime AND EndTime row[7] + Title row[8] */ /* Get code of the program item (row[0]) */ Item->ItmCod = Str_ConvertStrCodToLongCod (row[0]); /* Get index of the program item (row[1]) */ - Item->ItmInd = Prg_GetItmIndFromStr (row[1]); + Item->ItmInd = Str_ConvertStrToUnsigned (row[1]); - /* Get whether the program item is hidden or not (row[2]) */ - Item->Hidden = (row[2][0] == 'Y'); + /* Get level of the program item (row[2]) */ + Item->Level = Str_ConvertStrToUnsigned (row[2]); - /* Get author of the program item (row[3]) */ - Item->UsrCod = Str_ConvertStrCodToLongCod (row[3]); + /* Get whether the program item is hidden or not (row[3]) */ + Item->Hidden = (row[3][0] == 'Y'); - /* Get start date (row[4] holds the start UTC time) */ - Item->TimeUTC[Dat_START_TIME] = Dat_GetUNIXTimeFromStr (row[4]); + /* Get author of the program item (row[4]) */ + Item->UsrCod = Str_ConvertStrCodToLongCod (row[4]); - /* Get end date (row[5] holds the end UTC time) */ - Item->TimeUTC[Dat_END_TIME ] = Dat_GetUNIXTimeFromStr (row[5]); + /* Get start date (row[5] holds the start UTC time) */ + Item->TimeUTC[Dat_START_TIME] = Dat_GetUNIXTimeFromStr (row[5]); - /* Get whether the program item is open or closed (row(6)) */ - Item->Open = (row[6][0] == '1'); + /* Get end date (row[6] holds the end UTC time) */ + Item->TimeUTC[Dat_END_TIME ] = Dat_GetUNIXTimeFromStr (row[6]); - /* Get the title of the program item (row[7]) */ - Str_Copy (Item->Title,row[7], + /* Get whether the program item is open or closed (row(7)) */ + Item->Open = (row[7][0] == '1'); + + /* Get the title of the program item (row[8]) */ + Str_Copy (Item->Title,row[8], Prg_MAX_BYTES_PROGRAM_ITEM_TITLE); /* Can I do this program item? */ @@ -690,19 +721,6 @@ static void Prg_GetDataOfItem (struct ProgramItem *Item, 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 ************************/ /*****************************************************************************/ @@ -711,6 +729,7 @@ static void Prg_ResetItem (struct ProgramItem *Item) { Item->ItmCod = -1L; Item->ItmInd = 0; + Item->Level = 1; Item->Hidden = false; Item->UsrCod = -1L; Item->TimeUTC[Dat_START_TIME] = @@ -999,6 +1018,49 @@ void Prg_MoveDownPrgItem (void) Prg_SeeCourseProgram (); } +/*****************************************************************************/ +/**** Move right (increase level) position of an item in a course program ****/ +/*****************************************************************************/ + +void Prg_MoveRightPrgItem (void) + { + struct ProgramItem Item; + + /***** 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); + + /***** Move right item (increase level) *****/ + // TODO: Implement + + /***** Show program items again *****/ + Prg_SeeCourseProgram (); + } + +/*****************************************************************************/ +/**** Move left (decrease level) position of an item in a course program *****/ +/*****************************************************************************/ + +void Prg_MoveLeftPrgItem (void) + { + struct ProgramItem Item; + + /***** 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); + + /***** Move left item (decrease level) *****/ + // TODO: Implement + + /***** Show program items again *****/ + Prg_SeeCourseProgram (); + } /*****************************************************************************/ /**************** Get maximum item index in a course program *****************/ diff --git a/swad_program.h b/swad_program.h index b60beaf6..e528f991 100644 --- a/swad_program.h +++ b/swad_program.h @@ -43,6 +43,7 @@ struct ProgramItem { long ItmCod; unsigned ItmInd; + unsigned Level; bool Hidden; long UsrCod; time_t TimeUTC[Dat_NUM_START_END_TIME]; @@ -68,12 +69,17 @@ void Prg_GetDataOfItemByCod (struct ProgramItem *PrgItem); void Prg_FreeListItems (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_MoveRightPrgItem (void); +void Prg_MoveLeftPrgItem (void); + void Prg_RecFormPrgItem (void); bool Prg_CheckIfItemIsAssociatedToGrp (long PrgItmCod,long GrpCod); void Prg_RemoveGroup (long GrpCod); diff --git a/swad_string.c b/swad_string.c index 54f353d2..3246d3b8 100644 --- a/swad_string.c +++ b/swad_string.c @@ -2416,6 +2416,19 @@ long Str_ConvertStrCodToLongCod (const char *Str) return Code; } +/*****************************************************************************/ +/******************* Get parameter with index of question ********************/ +/*****************************************************************************/ + +unsigned Str_ConvertStrToUnsigned (const char *UnsignedStr) + { + long LongNum = Str_ConvertStrCodToLongCod (UnsignedStr); + + return (LongNum >= 0 && + LongNum <= UINT_MAX) ? (unsigned) LongNum : + 0; + } + /*****************************************************************************/ /**** Compute length of root (all except extension) of the name of a file ****/ /*****************************************************************************/ diff --git a/swad_string.h b/swad_string.h index e460cf4f..8e039b91 100644 --- a/swad_string.h +++ b/swad_string.h @@ -115,7 +115,10 @@ void Str_GetNextStringUntilSeparator (const char **StrSrc,char *StrDst,size_t Ma void Str_GetNextStringUntilComma (const char **StrSrc,char *StrDst,size_t MaxLength); void Str_ReplaceSeveralSpacesForOne (char *Str); void Str_CopyStrChangingSpaces (const char *StringWithSpaces,char *StringWithoutSpaces,unsigned MaxLength); + long Str_ConvertStrCodToLongCod (const char *Str); +unsigned Str_ConvertStrToUnsigned (const char *UnsignedStr); + size_t Str_GetLengthRootFileName (const char *FileName); void Str_SplitFullPathIntoPathAndFileName (const char FullPath[PATH_MAX + 1], char PathWithoutFileName[PATH_MAX + 1], diff --git a/swad_syllabus.c b/swad_syllabus.c index dad96f1e..6fb2d0a9 100644 --- a/swad_syllabus.c +++ b/swad_syllabus.c @@ -369,7 +369,7 @@ void Syl_LoadListItemsSyllabusIntoMemory (long CrsCod) /***** Return to the start of the list *****/ fseek (Gbl.F.XML,PostBeginList,SEEK_SET); - for (N = 1; + for (N = 1; N <= Syl_MAX_LEVELS_SYLLABUS; N++) CodItem[N] = 0; diff --git a/swad_text_action.c b/swad_text_action.c index 9fad7bb2..5fcea68b 100644 --- a/swad_text_action.c +++ b/swad_text_action.c @@ -4995,6 +4995,48 @@ const char *Txt_Actions[Act_NUM_ACTIONS] = "" // Potrzebujesz tlumaczenie #elif L==9 // pt "" // Precisa de tradução +#endif + , + [ActRgtPrgItm] = +#if L==1 // ca + "" // Necessita traducció +#elif L==2 // de + "" // Need Übersetzung +#elif L==3 // en + "Move right program item" +#elif L==4 // es + "Mover a la derecha í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 + , + [ActLftPrgItm] = +#if L==1 // ca + "" // Necessita traducció +#elif L==2 // de + "" // Need Übersetzung +#elif L==3 // en + "Move left program item" +#elif L==4 // es + "Mover a la izquierda í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] =