From 004c451068f7e9c5537efb46302fabbc6e57d41e Mon Sep 17 00:00:00 2001 From: acanas Date: Sun, 18 Sep 2022 23:15:43 +0200 Subject: [PATCH] Version 22.8: Sep 18, 2022 Links to games in program. --- swad_action.c | 2 + swad_action.h | 35 ++++++++------- swad_call_for_exam.c | 86 +++++++++++++++++------------------ swad_call_for_exam.h | 4 +- swad_changelog.h | 7 +-- swad_exam_database.c | 2 +- swad_game.c | 96 ++++++++++++++++++++++++++++++++++++++-- swad_game.h | 5 +++ swad_game_database.c | 18 +++++++- swad_game_database.h | 1 + swad_match_database.c | 2 +- swad_program_resource.c | 11 +++++ swad_question_database.c | 7 ++- swad_text_action.c | 23 ++++++++++ 14 files changed, 223 insertions(+), 76 deletions(-) diff --git a/swad_action.c b/swad_action.c index 2744d21e..9b0fc973 100644 --- a/swad_action.c +++ b/swad_action.c @@ -822,6 +822,7 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = [ActRemGamQst ] = {1665,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_RemoveQstFromGame ,NULL}, [ActUp_GamQst ] = {1668,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_MoveUpQst ,NULL}, [ActDwnGamQst ] = {1669,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_MoveDownQst ,NULL}, + [ActReqLnkGam ] = {1935,-1,TabUnk,ActSeeAllGam ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_GetLinkToGame ,NULL}, [ActSeeSvy ] = { 982,-1,TabUnk,ActSeeAllSvy ,0x3F8,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Svy_SeeOneSurvey ,NULL}, [ActAnsSvy ] = { 983,-1,TabUnk,ActSeeAllSvy ,0x3F8,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Svy_ReceiveSurveyAnswers ,NULL}, @@ -3779,6 +3780,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un ActSeeCliPrgRsc, // #1932 ActChgLnkPrgRsc, // #1933 ActReqLnkCfe, // #1934 + ActReqLnkGam, // #1935 }; /*****************************************************************************/ diff --git a/swad_action.h b/swad_action.h index 3e1a4978..53523862 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 1934 +#define Act_MAX_ACTION_COD 1935 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13 @@ -776,23 +776,24 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to #define ActRemGamQst (ActChgCrsTT1stDay + 222) #define ActUp_GamQst (ActChgCrsTT1stDay + 223) #define ActDwnGamQst (ActChgCrsTT1stDay + 224) +#define ActReqLnkGam (ActChgCrsTT1stDay + 225) -#define ActSeeSvy (ActChgCrsTT1stDay + 225) -#define ActAnsSvy (ActChgCrsTT1stDay + 226) -#define ActFrmNewSvy (ActChgCrsTT1stDay + 227) -#define ActEdiOneSvy (ActChgCrsTT1stDay + 228) -#define ActNewSvy (ActChgCrsTT1stDay + 229) -#define ActChgSvy (ActChgCrsTT1stDay + 230) -#define ActReqRemSvy (ActChgCrsTT1stDay + 231) -#define ActRemSvy (ActChgCrsTT1stDay + 232) -#define ActReqRstSvy (ActChgCrsTT1stDay + 233) -#define ActRstSvy (ActChgCrsTT1stDay + 234) -#define ActHidSvy (ActChgCrsTT1stDay + 235) -#define ActUnhSvy (ActChgCrsTT1stDay + 236) -#define ActEdiOneSvyQst (ActChgCrsTT1stDay + 237) -#define ActRcvSvyQst (ActChgCrsTT1stDay + 238) -#define ActReqRemSvyQst (ActChgCrsTT1stDay + 239) -#define ActRemSvyQst (ActChgCrsTT1stDay + 240) +#define ActSeeSvy (ActChgCrsTT1stDay + 226) +#define ActAnsSvy (ActChgCrsTT1stDay + 227) +#define ActFrmNewSvy (ActChgCrsTT1stDay + 228) +#define ActEdiOneSvy (ActChgCrsTT1stDay + 229) +#define ActNewSvy (ActChgCrsTT1stDay + 230) +#define ActChgSvy (ActChgCrsTT1stDay + 231) +#define ActReqRemSvy (ActChgCrsTT1stDay + 232) +#define ActRemSvy (ActChgCrsTT1stDay + 233) +#define ActReqRstSvy (ActChgCrsTT1stDay + 234) +#define ActRstSvy (ActChgCrsTT1stDay + 235) +#define ActHidSvy (ActChgCrsTT1stDay + 236) +#define ActUnhSvy (ActChgCrsTT1stDay + 237) +#define ActEdiOneSvyQst (ActChgCrsTT1stDay + 238) +#define ActRcvSvyQst (ActChgCrsTT1stDay + 239) +#define ActReqRemSvyQst (ActChgCrsTT1stDay + 240) +#define ActRemSvyQst (ActChgCrsTT1stDay + 241) /*****************************************************************************/ /******************************** Files tab **********************************/ diff --git a/swad_call_for_exam.c b/swad_call_for_exam.c index ba784a33..83105aa1 100644 --- a/swad_call_for_exam.c +++ b/swad_call_for_exam.c @@ -1688,7 +1688,49 @@ static void Cfe_GetNotifContentCallForExam (const struct Cfe_CallsForExams *Call } /*****************************************************************************/ -/******************** Write file name in course program **********************/ +/************************ Get link to call for exam **************************/ +/*****************************************************************************/ + +void Cfe_GetLinkToCallForExam (void) + { + extern const char *Txt_Link_to_resource_X_copied_into_clipboard; + struct Cfe_CallsForExams *CallsForExams = Cfe_GetGlobalCallsForExams (); + long ExaCod; + char SessionAndDate[Cfe_MAX_BYTES_SESSION_AND_DATE]; + + /***** Reset calls for exams context *****/ + Cfe_ResetCallsForExams (CallsForExams); + + /***** Get the code of the call for exam *****/ + if ((ExaCod = Cfe_GetParamExaCod ()) <= 0) + Err_WrongCallForExamExit (); + + /***** Get data of call for exam *****/ + Cfe_AllocMemCallForExam (CallsForExams); + Cfe_GetDataCallForExamFromDB (CallsForExams,ExaCod); + + /***** Session and date of the exam *****/ + Cfe_BuildSessionAndDate (CallsForExams,SessionAndDate); + + /***** Copy link to call for exam into resource clipboard *****/ + Prg_DB_CopyToClipboard (PrgRsc_CALL_FOR_EXAM,ExaCod); + + /***** Write sucess message *****/ + Ale_ShowAlert (Ale_SUCCESS,Txt_Link_to_resource_X_copied_into_clipboard, + SessionAndDate); + + /***** Free memory of the call for exam *****/ + Cfe_FreeMemCallForExam (CallsForExams); + + /***** Set exam to be highlighted *****/ + CallsForExams->HighlightExaCod = ExaCod; + + /***** Show again the list of calls for exams *****/ + Cfe_ListCallsForExamsEdit (); + } + +/*****************************************************************************/ +/******************* Write call for exam in course program *******************/ /*****************************************************************************/ void Cfe_WriteCallForExamInCrsProgram (long ExaCod,bool PutFormToGo) @@ -1735,48 +1777,6 @@ void Cfe_WriteCallForExamInCrsProgram (long ExaCod,bool PutFormToGo) } } -/*****************************************************************************/ -/************************ Get link to call for exam **************************/ -/*****************************************************************************/ - -void Cfe_GetLinkToCallForExam (void) - { - extern const char *Txt_Link_to_resource_X_copied_into_clipboard; - struct Cfe_CallsForExams *CallsForExams = Cfe_GetGlobalCallsForExams (); - long ExaCod; - char SessionAndDate[Cfe_MAX_BYTES_SESSION_AND_DATE]; - - /***** Reset calls for exams context *****/ - Cfe_ResetCallsForExams (CallsForExams); - - /***** Get the code of the call for exam *****/ - if ((ExaCod = Cfe_GetParamExaCod ()) <= 0) - Err_WrongCallForExamExit (); - - /***** Get data of call for exam *****/ - Cfe_AllocMemCallForExam (CallsForExams); - Cfe_GetDataCallForExamFromDB (CallsForExams,ExaCod); - - /***** Session and date of the exam *****/ - Cfe_BuildSessionAndDate (CallsForExams,SessionAndDate); - - /***** Copy link to call for exam into resource clipboard *****/ - Prg_DB_CopyToClipboard (PrgRsc_CALL_FOR_EXAM,ExaCod); - - /***** Write sucess message *****/ - Ale_ShowAlert (Ale_SUCCESS,Txt_Link_to_resource_X_copied_into_clipboard, - SessionAndDate); - - /***** Free memory of the call for exam *****/ - Cfe_FreeMemCallForExam (CallsForExams); - - /***** Set exam to be highlighted *****/ - CallsForExams->HighlightExaCod = ExaCod; - - /***** Show again the list of calls for exams *****/ - Cfe_ListCallsForExamsEdit (); - } - /*****************************************************************************/ /************** Get call for exam text from call for exam code ***************/ /*****************************************************************************/ diff --git a/swad_call_for_exam.h b/swad_call_for_exam.h index c507c9c0..0bfeedc3 100644 --- a/swad_call_for_exam.h +++ b/swad_call_for_exam.h @@ -126,9 +126,9 @@ void Cfe_GetSummaryAndContentCallForExam (char SummaryStr[Ntf_MAX_BYTES_SUMMARY char **ContentStr, long ExaCod,bool GetContent); -void Cfe_WriteCallForExamInCrsProgram (long ExaCod,bool PutFormToGo); - +//--------------------------- Program resources ------------------------------- void Cfe_GetLinkToCallForExam (void); +void Cfe_WriteCallForExamInCrsProgram (long ExaCod,bool PutFormToGo); void Cfe_GetTitleFromExaCod (long ExaCod,char *Title,size_t TitleSize); #endif diff --git a/swad_changelog.h b/swad_changelog.h index 9cd15296..558a916c 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -606,14 +606,15 @@ 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 22.7 (2022-09-17)" +#define Log_PLATFORM_VERSION "SWAD 22.8 (2022-09-18)" #define CSS_FILE "swad22.7.css" #define JS_FILE "swad21.100.js" /* - Version 22.7: Sep 18, 2022 Link to calls for exams in program. + Version 22.8: Sep 18, 2022 Links to games in program. (330355 lines) + Version 22.7: Sep 18, 2022 Links to calls for exams in program. Notification of a call for exam now links to the call. (330230 lines) Version 22.6: Sep 17, 2022 Changes in edition of program items. (330065 lines) - Version 22.5: Sep 16, 2022 Link to download document in program. (330018 lines) + Version 22.5: Sep 16, 2022 Links to download documents in program. (330018 lines) Version 22.4.2: Sep 16, 2022 Changes in edition of program items. (329982 lines) Version 22.4.1: Sep 15, 2022 Changes in edition of program items. (329955 lines) Copy the following icon to icon public directory: diff --git a/swad_exam_database.c b/swad_exam_database.c index 62a302ac..0b2b5dbe 100644 --- a/swad_exam_database.c +++ b/swad_exam_database.c @@ -1484,7 +1484,7 @@ unsigned Exa_DB_GetDataOfSessionByCod (MYSQL_RES **mysql_res,long SesCod) " AND ExaCod IN" // Extra check " (SELECT ExaCod" " FROM exa_exams" - " WHERE CrsCod='%ld')", + " WHERE CrsCod=%ld)", SesCod, Gbl.Hierarchy.Crs.CrsCod); } diff --git a/swad_game.c b/swad_game.c index 2b1340a4..f3614d65 100644 --- a/swad_game.c +++ b/swad_game.c @@ -47,6 +47,7 @@ #include "swad_match_database.h" #include "swad_match_result.h" #include "swad_pagination.h" +#include "swad_program_database.h" #include "swad_role.h" #include "swad_test.h" #include "swad_test_visibility.h" @@ -116,7 +117,7 @@ static void Gam_PutParamsToCreateNewGame (void *Games); static void Gam_ShowOneGame (struct Gam_Games *Games, struct Gam_Game *Game,bool ShowOnlyThisGame); -static void Gam_PutIconToShowResultsOfGame (void *Games); +static void Gam_PutIconsOneGame (void *Games); static void Gam_WriteAuthor (struct Gam_Game *Game); static void Gam_PutHiddenParamGameOrder (Gam_Order_t SelectedOrder); @@ -487,7 +488,7 @@ void Gam_ShowOnlyOneGameBegin (struct Gam_Games *Games, /***** Begin box *****/ Games->GamCod = Game->GamCod; Box_BoxBegin (NULL,Txt_Game, - Gam_PutIconToShowResultsOfGame,Games, + Gam_PutIconsOneGame,Games, Hlp_ASSESSMENT_Games,Box_NOT_CLOSABLE); /***** Show game *****/ @@ -691,7 +692,7 @@ static void Gam_ShowOneGame (struct Gam_Games *Games, /************* Put icon to show results of matches in a game *****************/ /*****************************************************************************/ -static void Gam_PutIconToShowResultsOfGame (void *Games) +static void Gam_PutIconsOneGame (void *Games) { static const Act_Action_t NextAction[Rol_NUM_ROLES] = { @@ -702,10 +703,17 @@ static void Gam_PutIconToShowResultsOfGame (void *Games) }; if (Games) + { /***** Put icon to view matches results *****/ if (NextAction[Gbl.Usrs.Me.Role.Logged]) Ico_PutContextualIconToShowResults (NextAction[Gbl.Usrs.Me.Role.Logged],MchRes_RESULTS_BOX_ID, Gam_PutParams,Games); + + /***** Link to get resource link *****/ + if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) // Only if I am superuser // TODO: Include teachers + Ico_PutContextualIconToGetLink (ActReqLnkGam,NULL, + Gam_PutParams,Games); + } } /*****************************************************************************/ @@ -2342,3 +2350,85 @@ void Gam_GetAndShowGamesStats (void) /***** End table and box *****/ Box_BoxTableEnd (); } + +/*****************************************************************************/ +/***************************** Get link to game ******************************/ +/*****************************************************************************/ + +void Gam_GetLinkToGame (void) + { + extern const char *Txt_Link_to_resource_X_copied_into_clipboard; + struct Gam_Games Games; + struct Gam_Game Game; + + /***** Reset games context *****/ + Gam_ResetGames (&Games); + + /***** Reset game *****/ + Gam_ResetGame (&Game); + + /***** Get parameters *****/ + if ((Game.GamCod = Gam_GetParams (&Games)) <= 0) + Err_WrongGameExit (); + + /***** Get data of the game from database *****/ + Gam_GetDataOfGameByCod (&Game); + + /***** Copy link to call for exam into resource clipboard *****/ + Prg_DB_CopyToClipboard (PrgRsc_GAME,Game.GamCod); + + /***** Write sucess message *****/ + Ale_ShowAlert (Ale_SUCCESS,Txt_Link_to_resource_X_copied_into_clipboard, + Game.Title); + + /***** Show games again *****/ + Gam_ListAllGames (&Games); + } + +/*****************************************************************************/ +/*********************** Write game in course program ************************/ +/*****************************************************************************/ + +void Gam_WriteGameInCrsProgram (long GamCod,bool PutFormToGo) + { + extern const char *Txt_Actions[Act_NUM_ACTIONS]; + char Title[Gam_MAX_BYTES_TITLE + 1]; + + /***** Get game title *****/ + Gam_DB_GetGameTitle (GamCod,Title); + + /***** Begin form to download file *****/ + if (PutFormToGo) + { + Frm_BeginForm (ActSeeGam); + Gam_PutParamGameCod (GamCod); + HTM_BUTTON_Submit_Begin (Txt_Actions[ActSeeOneCfe], + "class=\"LM BT_LINK PRG_RSC_%s\"", + The_GetSuffix ()); + } + + /***** Write Name of the course and date of exam *****/ + HTM_Txt (Title); + + /***** End form to download file *****/ + if (PutFormToGo) + { + /* End form */ + HTM_BUTTON_End (); + + Frm_EndForm (); + } + } + +/*****************************************************************************/ +/************** Get game title from call for exam code ***************/ +/*****************************************************************************/ + +void Gam_GetTitleFromGamCod (long GamCod,char *Title,size_t TitleSize) + { + char TitleFromDB[Gam_MAX_BYTES_TITLE + 1]; + + /***** Get game title *****/ + Gam_DB_GetGameTitle (GamCod,TitleFromDB); + Str_Copy (Title,TitleFromDB,TitleSize); + } diff --git a/swad_game.h b/swad_game.h index faca3a87..4b8b0a50 100644 --- a/swad_game.h +++ b/swad_game.h @@ -167,4 +167,9 @@ void Gam_GetScoreRange (long GamCod,double *MinScore,double *MaxScore); //-------------------------------- Figures ------------------------------------ void Gam_GetAndShowGamesStats (void); +//--------------------------- Program resources ------------------------------- +void Gam_GetLinkToGame (void); +void Gam_WriteGameInCrsProgram (long GamCod,bool PutFormToGo); +void Gam_GetTitleFromGamCod (long GamCod,char *Title,size_t TitleSize); + #endif diff --git a/swad_game_database.c b/swad_game_database.c index 79980fdf..fac0feaa 100644 --- a/swad_game_database.c +++ b/swad_game_database.c @@ -217,18 +217,32 @@ unsigned Gam_DB_GetDataOfGameByCod (MYSQL_RES **mysql_res,long GamCod) " LEFT JOIN mch_matches" " ON gam_games.GamCod=mch_matches.GamCod" " WHERE gam_games.GamCod=%ld" - " AND gam_games.CrsCod='%ld'", // Extra check + " AND gam_games.CrsCod=%ld", // Extra check GamCod, Gbl.Hierarchy.Crs.CrsCod); } +/*****************************************************************************/ +/*********************** Get game title from database ************************/ +/*****************************************************************************/ + +void Gam_DB_GetGameTitle (long GamCod,char Title[Gam_MAX_BYTES_TITLE + 1]) + { + DB_QuerySELECTString (Title,Gam_MAX_BYTES_TITLE,"can not get game title", + "SELECT Title" // row[0] + " FROM gam_games" + " WHERE GamCod=%ld" + " AND gam_games.CrsCod=%ld", // Extra check + GamCod, + Gbl.Hierarchy.Crs.CrsCod); + } + /*****************************************************************************/ /********************** Get game text from database ************************/ /*****************************************************************************/ void Gam_DB_GetGameTxt (long GamCod,char Txt[Cns_MAX_BYTES_TEXT + 1]) { - /***** Get text of game from database *****/ DB_QuerySELECTString (Txt,Cns_MAX_BYTES_TEXT,"can not get game text", "SELECT Txt" // row[0] " FROM gam_games" diff --git a/swad_game_database.h b/swad_game_database.h index 125c71d7..168aeb53 100644 --- a/swad_game_database.h +++ b/swad_game_database.h @@ -42,6 +42,7 @@ void Gam_DB_HideOrUnhideGame (long GamCod,bool Hide); unsigned Gam_DB_GetListGames (MYSQL_RES **mysql_res,Gam_Order_t SelectedOrder); unsigned Gam_DB_GetListAvailableGames (MYSQL_RES **mysql_res); unsigned Gam_DB_GetDataOfGameByCod (MYSQL_RES **mysql_res,long GamCod); +void Gam_DB_GetGameTitle (long GamCod,char Title[Gam_MAX_BYTES_TITLE + 1]); void Gam_DB_GetGameTxt (long GamCod,char Txt[Cns_MAX_BYTES_TEXT + 1]); bool Gam_DB_CheckIfSimilarGameExists (const struct Gam_Game *Game); unsigned Gam_DB_GetNumCoursesWithGames (HieLvl_Level_t Scope); diff --git a/swad_match_database.c b/swad_match_database.c index 848a8c01..af8893be 100644 --- a/swad_match_database.c +++ b/swad_match_database.c @@ -192,7 +192,7 @@ unsigned Mch_DB_GetDataOfMatchByCod (MYSQL_RES **mysql_res,long MchCod) " AND GamCod IN" // Extra check " (SELECT GamCod" " FROM gam_games" - " WHERE CrsCod='%ld')", + " WHERE CrsCod=%ld)", MchCod, Gbl.Hierarchy.Crs.CrsCod); } diff --git a/swad_program_resource.c b/swad_program_resource.c index e1293803..5da6f56f 100644 --- a/swad_program_resource.c +++ b/swad_program_resource.c @@ -31,6 +31,7 @@ #include "swad_call_for_exam.h" #include "swad_error.h" #include "swad_form.h" +#include "swad_game.h" #include "swad_global.h" #include "swad_program.h" #include "swad_program_database.h" @@ -1020,7 +1021,11 @@ static void PrgRsc_WriteLinkName (const struct Prg_Link *Link,bool PutForm) Cfe_WriteCallForExamInCrsProgram (Link->Cod,PutForm); break; case PrgRsc_EXAM: + Ale_ShowAlert (Ale_ERROR,"Not implemented!"); + break; case PrgRsc_GAME: + Gam_WriteGameInCrsProgram (Link->Cod,PutForm); + break; case PrgRsc_SURVEY: Ale_ShowAlert (Ale_ERROR,"Not implemented!"); break; @@ -1064,7 +1069,13 @@ static void PrgRsc_GetResourceTitleFromLink (struct Prg_Item *Item) sizeof (Item->Resource.Title) - 1); break; case PrgRsc_EXAM: + Ale_ShowAlert (Ale_ERROR,"Not implemented!"); + break; case PrgRsc_GAME: + Gam_GetTitleFromGamCod (Item->Resource.Link.Cod, + Item->Resource.Title, + sizeof (Item->Resource.Title) - 1); + break; case PrgRsc_SURVEY: Ale_ShowAlert (Ale_ERROR,"Not implemented!"); break; diff --git a/swad_question_database.c b/swad_question_database.c index c5808e55..4021cfcb 100644 --- a/swad_question_database.c +++ b/swad_question_database.c @@ -286,11 +286,11 @@ unsigned Qst_DB_GetQsts (MYSQL_RES **mysql_res, "tst_tags", Qst_MAX_BYTES_QUERY_QUESTIONS); - Str_Concat (Query," WHERE tst_questions.CrsCod='", + Str_Concat (Query," WHERE tst_questions.CrsCod=", Qst_MAX_BYTES_QUERY_QUESTIONS); snprintf (CrsCodStr,sizeof (CrsCodStr),"%ld",Gbl.Hierarchy.Crs.CrsCod); Str_Concat (Query,CrsCodStr,Qst_MAX_BYTES_QUERY_QUESTIONS); - Str_Concat (Query,"' AND tst_questions.EditTime>=FROM_UNIXTIME('", + Str_Concat (Query," AND tst_questions.EditTime>=FROM_UNIXTIME('", Qst_MAX_BYTES_QUERY_QUESTIONS); snprintf (LongStr,sizeof (LongStr),"%ld", (long) Gbl.DateRange.TimeUTC[Dat_STR_TIME]); @@ -307,10 +307,9 @@ unsigned Qst_DB_GetQsts (MYSQL_RES **mysql_res, { Str_Concat (Query," AND tst_questions.QstCod=tst_question_tags.QstCod" " AND tst_question_tags.TagCod=tst_tags.TagCod" - " AND tst_tags.CrsCod='", + " AND tst_tags.CrsCod=", Qst_MAX_BYTES_QUERY_QUESTIONS); Str_Concat (Query,CrsCodStr,Qst_MAX_BYTES_QUERY_QUESTIONS); - Str_Concat (Query,"'",Qst_MAX_BYTES_QUERY_QUESTIONS); LengthQuery = strlen (Query); NumItemInList = 0; Ptr = Questions->Tags.List; diff --git a/swad_text_action.c b/swad_text_action.c index 67f5f388..7f2aecc3 100644 --- a/swad_text_action.c +++ b/swad_text_action.c @@ -13607,6 +13607,29 @@ const char *Txt_Actions[Act_NUM_ACTIONS] = "Move down game question" // Precisa de tradução #elif L==10 // tr "Move down game question" // Çeviri lazim! +#endif + , + [ActReqLnkGam] = +#if L==1 // ca + "Copy link to game" // Necessita traducció +#elif L==2 // de + "Copy link to game" // Need Übersetzung +#elif L==3 // en + "Copy link to game" +#elif L==4 // es + "Copiar enlace a juego" +#elif L==5 // fr + "Copy link to game" // Besoin de traduction +#elif L==6 // gn + "Copiar enlace a juego" // Okoteve traducción +#elif L==7 // it + "Copy link to game" // Bisogno di traduzione +#elif L==8 // pl + "Copy link to game" // Potrzebujesz tlumaczenie +#elif L==9 // pt + "Copy link to game" // Precisa de tradução +#elif L==10 // tr + "Copy link to game" // Çeviri lazim! #endif , [ActSeeSvy] =