Version 22.80: Mar 25, 2023 Resources in rubric criteria. Not finished.

This commit is contained in:
acanas 2023-03-25 21:30:53 +01:00
parent 13aad1a6fe
commit d7b20db859
7 changed files with 230 additions and 25 deletions

View File

@ -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. 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 CSS_FILE "swad22.78.15.css"
#define JS_FILE "swad22.49.js" #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.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.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) Version 22.79: Mar 24, 2023 New action to change source of rubric criterion. (337888 lines)

View File

@ -70,7 +70,7 @@ typedef enum
PrgRsc_FORUM_THREAD, PrgRsc_FORUM_THREAD,
} PrgRsc_Type_t; } PrgRsc_Type_t;
struct Prg_Link struct PrgRsc_Link
{ {
PrgRsc_Type_t Type; PrgRsc_Type_t Type;
long Cod; long Cod;
@ -98,7 +98,7 @@ struct Prg_Item
struct struct
{ {
struct Prg_ResourceHierarchy Hierarchy; struct Prg_ResourceHierarchy Hierarchy;
struct Prg_Link Link; struct PrgRsc_Link Link;
char Title[PrgRsc_MAX_BYTES_PROGRAM_RESOURCE_TITLE + 1]; char Title[PrgRsc_MAX_BYTES_PROGRAM_RESOURCE_TITLE + 1];
} Resource; } Resource;
}; };

View File

@ -707,7 +707,7 @@ unsigned Prg_DB_GetClipboard (MYSQL_RES **mysql_res)
/*************************** Remove link from clipboard **********************/ /*************************** 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", DB_QueryDELETE ("can not remove link from clipboard",
"DELETE FROM prg_clipboards" "DELETE FROM prg_clipboards"

View File

@ -79,7 +79,7 @@ void Prg_DB_UpdateRscLink (const struct Prg_Item *Item);
void Prg_DB_CopyToClipboard (PrgRsc_Type_t Type,long Cod); void Prg_DB_CopyToClipboard (PrgRsc_Type_t Type,long Cod);
unsigned Prg_DB_GetClipboard (MYSQL_RES **mysql_res); 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); void Prg_DB_InsertItemInExpandedItems (long ItmCod);
bool Prg_DB_GetIfExpandedItem (long ItmCod); bool Prg_DB_GetIfExpandedItem (long ItmCod);

View File

@ -126,15 +126,15 @@ static bool PrgRsc_ExchangeResources (const struct Prg_ResourceHierarchy *Rsc1,
const struct Prg_ResourceHierarchy *Rsc2); const struct Prg_ResourceHierarchy *Rsc2);
static void PrgRsc_ShowClipboard (struct Prg_Item *Item); static void PrgRsc_ShowClipboard (struct Prg_Item *Item);
static void PrgRsc_WriteRowClipboard (bool SubmitOnClick,const struct Prg_Link *Link); static void PrgRsc_WriteRowClipboard (bool SubmitOnClick,const struct PrgRsc_Link *Link);
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); const char *Icon,const char *IconTitle);
static void PrgRsc_WriteEmptyLinkInCrsProgram (__attribute__((unused)) long Cod, static void PrgRsc_WriteEmptyLinkInCrsProgram (__attribute__((unused)) long Cod,
__attribute__((unused)) bool PutFormToGo, __attribute__((unused)) bool PutFormToGo,
const char *Icon,const char *IconTitle); const char *Icon,const char *IconTitle);
static void PrgRsc_GetResourceTitleFromLink (struct Prg_Item *Item); static void PrgRsc_GetResourceTitleFromLink (struct Prg_Item *Item);
static void PrgRsc_GetLinkDataFromRow (MYSQL_RES *mysql_res, static void PrgRsc_GetLinkDataFromRow (MYSQL_RES *mysql_res,
struct Prg_Link *Link); struct PrgRsc_Link *Link);
/*****************************************************************************/ /*****************************************************************************/
/****************************** View resources *******************************/ /****************************** View resources *******************************/
@ -907,8 +907,8 @@ static void PrgRsc_ShowClipboard (struct Prg_Item *Item)
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
unsigned NumLink; unsigned NumLink;
unsigned NumLinks; unsigned NumLinks;
struct Prg_Link Link; struct PrgRsc_Link Link;
static const struct Prg_Link EmptyLink = static const struct PrgRsc_Link EmptyLink =
{ {
.Type = PrgRsc_NONE, .Type = PrgRsc_NONE,
.Cod = -1L, .Cod = -1L,
@ -954,7 +954,7 @@ static void PrgRsc_ShowClipboard (struct Prg_Item *Item)
/************************ Show one link from clipboard ***********************/ /************************ 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 *Prg_ResourceTypesDB[PrgRsc_NUM_TYPES];
extern const char *Txt_RESOURCE_TYPES[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...) ***************/ /************* 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) const char *Icon,const char *IconTitle)
{ {
static void (*WriteLinkName[PrgRsc_NUM_TYPES]) (long Cod,bool PutFormToGo, 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, static void PrgRsc_WriteEmptyLinkInCrsProgram (__attribute__((unused)) long Cod,
@ -1023,7 +1023,7 @@ static void PrgRsc_WriteEmptyLinkInCrsProgram (__attribute__((unused)) long Cod,
/***** Icon depending on type ******/ /***** Icon depending on type ******/
Ico_PutIconOn (Icon,Ico_BLACK,IconTitle); Ico_PutIconOn (Icon,Ico_BLACK,IconTitle);
/***** Write Name of the course and date of exam *****/ /***** Write text *****/
HTM_Txt (Txt_RESOURCE_TYPES[PrgRsc_NONE]); HTM_Txt (Txt_RESOURCE_TYPES[PrgRsc_NONE]);
} }
@ -1117,7 +1117,7 @@ void PrgRsc_ChangeLink (void)
/*****************************************************************************/ /*****************************************************************************/
static void PrgRsc_GetLinkDataFromRow (MYSQL_RES *mysql_res, static void PrgRsc_GetLinkDataFromRow (MYSQL_RES *mysql_res,
struct Prg_Link *Link) struct PrgRsc_Link *Link)
{ {
MYSQL_ROW row; MYSQL_ROW row;

View File

@ -30,13 +30,18 @@
#include "swad_action_list.h" #include "swad_action_list.h"
#include "swad_alert.h" #include "swad_alert.h"
#include "swad_assignment_resource.h"
#include "swad_box.h" #include "swad_box.h"
#include "swad_database.h" #include "swad_database.h"
#include "swad_error.h" #include "swad_error.h"
#include "swad_exam_resource.h"
#include "swad_form.h" #include "swad_form.h"
#include "swad_game_resource.h"
#include "swad_global.h" #include "swad_global.h"
#include "swad_parameter.h" #include "swad_parameter.h"
#include "swad_parameter_code.h" #include "swad_parameter_code.h"
#include "swad_program_database.h"
#include "swad_program_resource.h"
#include "swad_rubric.h" #include "swad_rubric.h"
#include "swad_rubric_criteria.h" #include "swad_rubric_criteria.h"
#include "swad_rubric_database.h" #include "swad_rubric_database.h"
@ -58,6 +63,26 @@ static const char *RubCri_ParValues[RubCri_NUM_VALUES] =
[RubCri_MAX] = "MaxVal", [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 ****************************/ /***************************** Private prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
@ -93,6 +118,18 @@ static void RubCri_GetAndCheckPars (struct Rub_Rubrics *Rubrics,
static void RubCri_ExchangeCriteria (long RubCod, static void RubCri_ExchangeCriteria (long RubCod,
unsigned CriIndTop,unsigned CriIndBottom); 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 ******************/ /*************** Put parameter to edit one rubric criterion ******************/
/*****************************************************************************/ /*****************************************************************************/
@ -703,6 +740,7 @@ static void RubCri_ListOneOrMoreCriteriaForEdition (struct Rub_Rubrics *Rubrics,
/***** Source *****/ /***** Source *****/
HTM_TD_Begin ("class=\"LT %s\"",The_GetColorRows ()); HTM_TD_Begin ("class=\"LT %s\"",The_GetColorRows ());
/* Type of source selector */
Frm_BeginFormAnchor (ActChgSrcRubCri,Anchor); Frm_BeginFormAnchor (ActChgSrcRubCri,Anchor);
RubCri_PutParsOneCriterion (Rubrics); RubCri_PutParsOneCriterion (Rubrics);
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE, HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,
@ -719,6 +757,12 @@ static void RubCri_ListOneOrMoreCriteriaForEdition (struct Rub_Rubrics *Rubrics,
} }
HTM_SELECT_End (); HTM_SELECT_End ();
Frm_EndForm (); Frm_EndForm ();
HTM_BR ();
/* Resource */
RubCri_ShowResource (&Criterion,
true,Anchor); // Editing
HTM_TD_End (); HTM_TD_End ();
/***** Minimum and maximum values of criterion *****/ /***** 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) 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) if (Source >= RubCri_NUM_SOURCES)
Source = RubCri_SOURCE_DEFAULT; Source = RubCri_SOURCE_DEFAULT;
@ -1172,3 +1208,171 @@ static void RubCri_ExchangeCriteria (long RubCod,
/***** Unlock table *****/ /***** Unlock table *****/
DB_UnlockTables (); 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]);
}

View File

@ -36675,7 +36675,7 @@ const char *Txt_Resources_of_X = // Warning: it is very important to include %s
#elif L==5 // fr #elif L==5 // fr
"Ressources de %s"; "Ressources de %s";
#elif L==6 // gn #elif L==6 // gn
"Recursos de %s"; // Okoteve traducción "%s recursos rehegua";
#elif L==7 // it #elif L==7 // it
"Risorse di %s"; "Risorse di %s";
#elif L==8 // pl #elif L==8 // pl