diff --git a/swad_changelog.h b/swad_changelog.h index 04bf95a7..9c41708d 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -629,11 +629,12 @@ TODO: Emilce Barrera Mesa: Podr TODO: Emilce Barrera Mesa: Mis estudiantes presentan muchas dificultades a la hora de poner la foto porque la plataforma es muy exigente respecto al fondo de la imagen. */ -#define Log_PLATFORM_VERSION "SWAD 22.79.3 (2023-03-24)" +#define Log_PLATFORM_VERSION "SWAD 22.80 (2023-03-25)" #define CSS_FILE "swad22.78.15.css" #define JS_FILE "swad22.49.js" /* - Version 22.79.3: Mar 24, 2023 Translation of some actions. (? lines) + Version 22.80: Mar 25, 2023 Resources in rubric criteria. Not finished. (338110 lines) + Version 22.79.3: Mar 24, 2023 Translation of some actions. (337938 lines) Version 22.79.2: Mar 24, 2023 Code refactoring in rubrics. (337937 lines) Version 22.79.1: Mar 24, 2023 Translation of some actions. (337889 lines) Version 22.79: Mar 24, 2023 New action to change source of rubric criterion. (337888 lines) diff --git a/swad_program.h b/swad_program.h index 03e09218..04c1f516 100644 --- a/swad_program.h +++ b/swad_program.h @@ -70,7 +70,7 @@ typedef enum PrgRsc_FORUM_THREAD, } PrgRsc_Type_t; -struct Prg_Link +struct PrgRsc_Link { PrgRsc_Type_t Type; long Cod; @@ -98,7 +98,7 @@ struct Prg_Item struct { struct Prg_ResourceHierarchy Hierarchy; - struct Prg_Link Link; + struct PrgRsc_Link Link; char Title[PrgRsc_MAX_BYTES_PROGRAM_RESOURCE_TITLE + 1]; } Resource; }; diff --git a/swad_program_database.c b/swad_program_database.c index cd402782..9e1e4b85 100644 --- a/swad_program_database.c +++ b/swad_program_database.c @@ -707,7 +707,7 @@ unsigned Prg_DB_GetClipboard (MYSQL_RES **mysql_res) /*************************** Remove link from clipboard **********************/ /*****************************************************************************/ -void Prg_DB_RemoveLinkFromClipboard (struct Prg_Link *Link) +void Prg_DB_RemoveLinkFromClipboard (struct PrgRsc_Link *Link) { DB_QueryDELETE ("can not remove link from clipboard", "DELETE FROM prg_clipboards" diff --git a/swad_program_database.h b/swad_program_database.h index 3e2108eb..eef611c2 100644 --- a/swad_program_database.h +++ b/swad_program_database.h @@ -79,7 +79,7 @@ void Prg_DB_UpdateRscLink (const struct Prg_Item *Item); void Prg_DB_CopyToClipboard (PrgRsc_Type_t Type,long Cod); unsigned Prg_DB_GetClipboard (MYSQL_RES **mysql_res); -void Prg_DB_RemoveLinkFromClipboard (struct Prg_Link *Link); +void Prg_DB_RemoveLinkFromClipboard (struct PrgRsc_Link *Link); void Prg_DB_InsertItemInExpandedItems (long ItmCod); bool Prg_DB_GetIfExpandedItem (long ItmCod); diff --git a/swad_program_resource.c b/swad_program_resource.c index 69f00850..b04de201 100644 --- a/swad_program_resource.c +++ b/swad_program_resource.c @@ -126,15 +126,15 @@ static bool PrgRsc_ExchangeResources (const struct Prg_ResourceHierarchy *Rsc1, const struct Prg_ResourceHierarchy *Rsc2); static void PrgRsc_ShowClipboard (struct Prg_Item *Item); -static void PrgRsc_WriteRowClipboard (bool SubmitOnClick,const struct Prg_Link *Link); -static void PrgRsc_WriteLinkName (const struct Prg_Link *Link,bool PutFormToGo, +static void PrgRsc_WriteRowClipboard (bool SubmitOnClick,const struct PrgRsc_Link *Link); +static void PrgRsc_WriteLinkName (const struct PrgRsc_Link *Link,bool PutFormToGo, const char *Icon,const char *IconTitle); static void PrgRsc_WriteEmptyLinkInCrsProgram (__attribute__((unused)) long Cod, __attribute__((unused)) bool PutFormToGo, const char *Icon,const char *IconTitle); static void PrgRsc_GetResourceTitleFromLink (struct Prg_Item *Item); static void PrgRsc_GetLinkDataFromRow (MYSQL_RES *mysql_res, - struct Prg_Link *Link); + struct PrgRsc_Link *Link); /*****************************************************************************/ /****************************** View resources *******************************/ @@ -907,8 +907,8 @@ static void PrgRsc_ShowClipboard (struct Prg_Item *Item) MYSQL_RES *mysql_res; unsigned NumLink; unsigned NumLinks; - struct Prg_Link Link; - static const struct Prg_Link EmptyLink = + struct PrgRsc_Link Link; + static const struct PrgRsc_Link EmptyLink = { .Type = PrgRsc_NONE, .Cod = -1L, @@ -954,7 +954,7 @@ static void PrgRsc_ShowClipboard (struct Prg_Item *Item) /************************ Show one link from clipboard ***********************/ /*****************************************************************************/ -static void PrgRsc_WriteRowClipboard (bool SubmitOnClick,const struct Prg_Link *Link) +static void PrgRsc_WriteRowClipboard (bool SubmitOnClick,const struct PrgRsc_Link *Link) { extern const char *Prg_ResourceTypesDB[PrgRsc_NUM_TYPES]; extern const char *Txt_RESOURCE_TYPES[PrgRsc_NUM_TYPES]; @@ -983,7 +983,7 @@ static void PrgRsc_WriteRowClipboard (bool SubmitOnClick,const struct Prg_Link * /************* Write link name (filename, assignment title...) ***************/ /*****************************************************************************/ -static void PrgRsc_WriteLinkName (const struct Prg_Link *Link,bool PutFormToGo, +static void PrgRsc_WriteLinkName (const struct PrgRsc_Link *Link,bool PutFormToGo, const char *Icon,const char *IconTitle) { static void (*WriteLinkName[PrgRsc_NUM_TYPES]) (long Cod,bool PutFormToGo, @@ -1011,7 +1011,7 @@ static void PrgRsc_WriteLinkName (const struct Prg_Link *Link,bool PutFormToGo, } /*****************************************************************************/ -/********************** Write survey in course program ***********************/ +/******************** Write empty link in course program *********************/ /*****************************************************************************/ static void PrgRsc_WriteEmptyLinkInCrsProgram (__attribute__((unused)) long Cod, @@ -1023,7 +1023,7 @@ static void PrgRsc_WriteEmptyLinkInCrsProgram (__attribute__((unused)) long Cod, /***** Icon depending on type ******/ Ico_PutIconOn (Icon,Ico_BLACK,IconTitle); - /***** Write Name of the course and date of exam *****/ + /***** Write text *****/ HTM_Txt (Txt_RESOURCE_TYPES[PrgRsc_NONE]); } @@ -1117,7 +1117,7 @@ void PrgRsc_ChangeLink (void) /*****************************************************************************/ static void PrgRsc_GetLinkDataFromRow (MYSQL_RES *mysql_res, - struct Prg_Link *Link) + struct PrgRsc_Link *Link) { MYSQL_ROW row; diff --git a/swad_rubric_criteria.c b/swad_rubric_criteria.c index de06cd59..7b7fa5dc 100644 --- a/swad_rubric_criteria.c +++ b/swad_rubric_criteria.c @@ -30,13 +30,18 @@ #include "swad_action_list.h" #include "swad_alert.h" +#include "swad_assignment_resource.h" #include "swad_box.h" #include "swad_database.h" #include "swad_error.h" +#include "swad_exam_resource.h" #include "swad_form.h" +#include "swad_game_resource.h" #include "swad_global.h" #include "swad_parameter.h" #include "swad_parameter_code.h" +#include "swad_program_database.h" +#include "swad_program_resource.h" #include "swad_rubric.h" #include "swad_rubric_criteria.h" #include "swad_rubric_database.h" @@ -58,6 +63,26 @@ static const char *RubCri_ParValues[RubCri_NUM_VALUES] = [RubCri_MAX] = "MaxVal", }; +static const char *RubCri_SourceDB[RubCri_NUM_SOURCES] = + { + [RubCri_FROM_TEACHER ] = "teacher", + [RubCri_FROM_ANOTHER_RUBRIC] = "rubric", + [RubCri_FROM_EXAM_PRINT ] = "exam", + [RubCri_FROM_GAME_MATCH ] = "game", + }; + +/*****************************************************************************/ +/**************************** Private constants ******************************/ +/*****************************************************************************/ + +const char *RubCri_SourceIcons[RubCri_NUM_SOURCES] = + { + [RubCri_FROM_TEACHER ] = "user-tie.svg", + [RubCri_FROM_ANOTHER_RUBRIC] = "tasks.svg", + [RubCri_FROM_EXAM_PRINT ] = "file-signature.svg", + [RubCri_FROM_GAME_MATCH ] = "gamepad.svg", + }; + /*****************************************************************************/ /***************************** Private prototypes ****************************/ /*****************************************************************************/ @@ -93,6 +118,18 @@ static void RubCri_GetAndCheckPars (struct Rub_Rubrics *Rubrics, static void RubCri_ExchangeCriteria (long RubCod, unsigned CriIndTop,unsigned CriIndBottom); +static void RubCri_ShowResource (struct RubCri_Criterion *Criterion, + bool Editing,const char *Anchor); +static void RubCri_ShowClipboard (struct RubCri_Criterion *Criterion,const char *Anchor); +static void RubCri_GetLinkDataFromRow (MYSQL_RES *mysql_res, + struct RubCri_Criterion *Criterion); +static void RubCri_WriteRowClipboard (bool SubmitOnClick, + const struct RubCri_Criterion *Criterion); +static void RubCri_WriteLinkName (const struct RubCri_Criterion *Criterion,bool PutFormToGo); +static void RubCri_WriteEmptyLinkInRubricCriterion (__attribute__((unused)) long Cod, + __attribute__((unused)) bool PutFormToGo, + const char *Icon,const char *IconTitle); + /*****************************************************************************/ /*************** Put parameter to edit one rubric criterion ******************/ /*****************************************************************************/ @@ -703,6 +740,7 @@ static void RubCri_ListOneOrMoreCriteriaForEdition (struct Rub_Rubrics *Rubrics, /***** Source *****/ HTM_TD_Begin ("class=\"LT %s\"",The_GetColorRows ()); + /* Type of source selector */ Frm_BeginFormAnchor (ActChgSrcRubCri,Anchor); RubCri_PutParsOneCriterion (Rubrics); HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE, @@ -719,6 +757,12 @@ static void RubCri_ListOneOrMoreCriteriaForEdition (struct Rub_Rubrics *Rubrics, } HTM_SELECT_End (); Frm_EndForm (); + + HTM_BR (); + + /* Resource */ + RubCri_ShowResource (&Criterion, + true,Anchor); // Editing HTM_TD_End (); /***** Minimum and maximum values of criterion *****/ @@ -864,14 +908,6 @@ RubCri_Source_t RubCri_GetSourceFromDBStr (const char *SourceDBStr) const char *RubCri_GetDBStrFromSource (RubCri_Source_t Source) { - static const char *RubCri_SourceDB[RubCri_NUM_SOURCES] = - { - [RubCri_FROM_TEACHER ] = "teacher", - [RubCri_FROM_ANOTHER_RUBRIC] = "rubric", - [RubCri_FROM_EXAM_PRINT ] = "exam", - [RubCri_FROM_GAME_MATCH ] = "game", - }; - if (Source >= RubCri_NUM_SOURCES) Source = RubCri_SOURCE_DEFAULT; @@ -1172,3 +1208,171 @@ static void RubCri_ExchangeCriteria (long RubCod, /***** Unlock table *****/ DB_UnlockTables (); } + +/*****************************************************************************/ +/************************** Show criterion resource **************************/ +/*****************************************************************************/ + +static void RubCri_ShowResource (struct RubCri_Criterion *Criterion, + bool Editing,const char *Anchor) + { + return; // TODO: Provisional. Remove! + + // TODO + if (Editing) + RubCri_ShowClipboard (Criterion,Anchor); + else + RubCri_WriteLinkName (Criterion, + true); // Put form + } + +/*****************************************************************************/ +/***************** Show clipboard to change resource link ********************/ +/*****************************************************************************/ + +static void RubCri_ShowClipboard (struct RubCri_Criterion *Criterion,const char *Anchor) + { + MYSQL_RES *mysql_res; + unsigned NumLink; + unsigned NumLinks; + // struct PrgRsc_Link Link; + struct RubCri_Criterion Cri; + /* + static const struct PrgRsc_Link EmptyLink = + { + .Type = PrgRsc_NONE, + .Cod = -1L, + }; */ + + /***** Begin form *****/ + Frm_BeginFormAnchor (ActChgLnkPrgRsc,Anchor); + /* + if (Item->Resource.Hierarchy.RscCod > 0) + ParCod_PutPar (ParCod_Rsc,Item->Resource.Hierarchy.RscCod); + else + * No resource selected, so it's a new resource at the end of the item * + ParCod_PutPar (ParCod_Itm,Item->Hierarchy.ItmCod); + */ + + /***** Begin list *****/ + HTM_UL_Begin ("class=\"PRG_CLIPBOARD\""); + + /***** Current link (empty or not) *****/ + RubCri_WriteRowClipboard (false,Criterion); + + /***** Row with empty link to remove the current link *****/ + /* + if (Criterion->Source != RubCri_FROM_TEACHER) + RubCri_WriteRowClipboard (true,&EmptyLink); */ + + /***** Get links in clipboard from database and write them *****/ + NumLinks = Prg_DB_GetClipboard (&mysql_res); + for (NumLink = 1; + NumLink <= NumLinks; + NumLink++) + { + RubCri_GetLinkDataFromRow (mysql_res,&Cri); + /* + Cri.Source = Link->Type; + Cri.Cod = Link->Cod; + */ + RubCri_WriteRowClipboard (true,&Cri); + } + DB_FreeMySQLResult (&mysql_res); + + /***** End list *****/ + HTM_UL_End (); + + /***** End form *****/ + Frm_EndForm (); + } + +/*****************************************************************************/ +/********************** Get resource data from clipboard *********************/ +/*****************************************************************************/ + +static void RubCri_GetLinkDataFromRow (MYSQL_RES *mysql_res, + struct RubCri_Criterion *Criterion) + { + MYSQL_ROW row; + + /***** Get row *****/ + row = mysql_fetch_row (mysql_res); + /* + Type row[0] + Cod row[1] + */ + /***** Get type (row[0]) *****/ + Criterion->Source = (RubCri_Source_t) PrgRsc_GetTypeFromString (row[0]); // TODO + + /***** Get code (row[1]) *****/ + Criterion->Cod = Str_ConvertStrCodToLongCod (row[1]); + } + +/*****************************************************************************/ +/************************ Show one link from clipboard ***********************/ +/*****************************************************************************/ + +static void RubCri_WriteRowClipboard (bool SubmitOnClick, + const struct RubCri_Criterion *Criterion) + { + HTM_LI_Begin ("class=\"PRG_RSC_%s\"",The_GetSuffix ()); + HTM_LABEL_Begin (NULL); + + /***** Radio selector *****/ + HTM_INPUT_RADIO ("Link",SubmitOnClick, + "value=\"%s_%ld\"%s", + RubCri_SourceDB[Criterion->Source],Criterion->Cod, + SubmitOnClick ? "" : + " checked=\"checked\""); + + /***** Name *****/ + RubCri_WriteLinkName (Criterion, + false); // Don't put form + + HTM_LABEL_End (); + HTM_LI_End (); + } + +/*****************************************************************************/ +/************* Write link name (filename, assignment title...) ***************/ +/*****************************************************************************/ + +static void RubCri_WriteLinkName (const struct RubCri_Criterion *Criterion,bool PutFormToGo) + { + extern const char *Txt_RUBRIC_CRITERION_SOURCES[RubCri_NUM_SOURCES]; + static void (*WriteLinkName[RubCri_NUM_SOURCES]) (long Cod,bool PutFormToGo, + const char *Icon, + const char *IconTitle) = + { + [RubCri_FROM_TEACHER ] = RubCri_WriteEmptyLinkInRubricCriterion, + [RubCri_FROM_ANOTHER_RUBRIC] = AsgRsc_WriteAssignmentInCrsProgram, + [RubCri_FROM_EXAM_PRINT ] = ExaRsc_WriteExamInCrsProgram, + [RubCri_FROM_GAME_MATCH ] = GamRsc_WriteGameInCrsProgram, + }; + + /***** Write link name *****/ + if (WriteLinkName[Criterion->Source]) + WriteLinkName[Criterion->Source] (Criterion->Cod,PutFormToGo, + RubCri_SourceIcons[Criterion->Source], + Txt_RUBRIC_CRITERION_SOURCES[Criterion->Source]); + else + Ale_ShowAlert (Ale_ERROR,"Not implemented!"); + } + +/*****************************************************************************/ +/******************** Write empty link in course program *********************/ +/*****************************************************************************/ + +static void RubCri_WriteEmptyLinkInRubricCriterion (__attribute__((unused)) long Cod, + __attribute__((unused)) bool PutFormToGo, + const char *Icon,const char *IconTitle) + { + extern const char *Txt_RUBRIC_CRITERION_SOURCES[RubCri_NUM_SOURCES]; + + /***** Icon depending on type ******/ + Ico_PutIconOn (Icon,Ico_BLACK,IconTitle); + + /***** Write text *****/ + HTM_Txt (Txt_RUBRIC_CRITERION_SOURCES[RubCri_FROM_TEACHER]); + } diff --git a/swad_text.c b/swad_text.c index 75341d74..ad1821e3 100644 --- a/swad_text.c +++ b/swad_text.c @@ -36675,7 +36675,7 @@ const char *Txt_Resources_of_X = // Warning: it is very important to include %s #elif L==5 // fr "Ressources de %s"; #elif L==6 // gn - "Recursos de %s"; // Okoteve traducción + "%s recursos rehegua"; #elif L==7 // it "Risorse di %s"; #elif L==8 // pl