diff --git a/Makefile b/Makefile
index 1709ae65..91b666c2 100644
--- a/Makefile
+++ b/Makefile
@@ -85,7 +85,7 @@ OBJS = swad_account.o swad_account_database.o swad_action.o swad_action_list.o \
swad_record.o swad_record_database.o swad_report.o \
swad_report_database.o swad_resource.o swad_role.o swad_role_database.o \
swad_room.o swad_room_database.o swad_RSS.o swad_rubric.o \
- swad_rubric_criteria.o swad_rubric_database.o \
+ swad_rubric_criteria.o swad_rubric_database.o swad_rubric_resource.o \
swad_scope.o swad_search.o swad_session.o swad_session_database.o \
swad_setting.o swad_setting_database.o swad_statistic.o \
swad_statistic_database.o swad_string.o swad_survey.o \
diff --git a/swad_action_list.c b/swad_action_list.c
index 70e0e5ae..6d86d218 100644
--- a/swad_action_list.c
+++ b/swad_action_list.c
@@ -101,6 +101,7 @@
#include "swad_role.h"
#include "swad_rubric.h"
#include "swad_rubric_criteria.h"
+#include "swad_rubric_resource.h"
#include "swad_search.h"
#include "swad_session.h"
#include "swad_setting.h"
@@ -843,6 +844,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActChgRub ] = {1956,-1,TabUnk,ActSeeAllRub ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Rub_ReceiveFormRubric ,NULL},
[ActReqRemRub ] = {1957,-1,TabUnk,ActSeeAllRub ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Rub_AskRemRubric ,NULL},
[ActRemRub ] = {1958,-1,TabUnk,ActSeeAllRub ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Rub_RemoveRubric ,NULL},
+ [ActReqLnkRub ] = {1969,-1,TabUnk,ActSeeAllRub ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,RubRsc_GetLinkToRubric ,NULL},
[ActNewRubCri ] = {1959,-1,TabUnk,ActSeeAllRub ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,RubCri_ReceiveFormCriterion ,NULL},
[ActReqRemRubCri ] = {1960,-1,TabUnk,ActSeeAllRub ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,RubCri_ReqRemCriterion ,NULL},
@@ -3854,4 +3856,5 @@ Act_Action_t ActLst_FromActCodToAction[1 + ActLst_MAX_ACTION_COD] = // Do not re
ActChgMaxRubCri, // #1966
ActChgWeiRubCri, // #1967
ActChgSrcRubCri, // #1968
+ ActReqLnkRub, // #1969
};
diff --git a/swad_action_list.h b/swad_action_list.h
index 294893e4..7fa13d30 100644
--- a/swad_action_list.h
+++ b/swad_action_list.h
@@ -766,17 +766,18 @@
#define ActChgRub (ActChgCrsTT1stDay + 224)
#define ActReqRemRub (ActChgCrsTT1stDay + 225)
#define ActRemRub (ActChgCrsTT1stDay + 226)
+#define ActReqLnkRub (ActChgCrsTT1stDay + 227)
-#define ActNewRubCri (ActChgCrsTT1stDay + 227)
-#define ActReqRemRubCri (ActChgCrsTT1stDay + 228)
-#define ActRemRubCri (ActChgCrsTT1stDay + 229)
-#define ActUp_RubCri (ActChgCrsTT1stDay + 230)
-#define ActDwnRubCri (ActChgCrsTT1stDay + 231)
-#define ActChgTitRubCri (ActChgCrsTT1stDay + 232)
-#define ActChgSrcRubCri (ActChgCrsTT1stDay + 233)
-#define ActChgMinRubCri (ActChgCrsTT1stDay + 234)
-#define ActChgMaxRubCri (ActChgCrsTT1stDay + 235)
-#define ActChgWeiRubCri (ActChgCrsTT1stDay + 236)
+#define ActNewRubCri (ActChgCrsTT1stDay + 228)
+#define ActReqRemRubCri (ActChgCrsTT1stDay + 229)
+#define ActRemRubCri (ActChgCrsTT1stDay + 230)
+#define ActUp_RubCri (ActChgCrsTT1stDay + 231)
+#define ActDwnRubCri (ActChgCrsTT1stDay + 232)
+#define ActChgTitRubCri (ActChgCrsTT1stDay + 233)
+#define ActChgSrcRubCri (ActChgCrsTT1stDay + 234)
+#define ActChgMinRubCri (ActChgCrsTT1stDay + 235)
+#define ActChgMaxRubCri (ActChgCrsTT1stDay + 236)
+#define ActChgWeiRubCri (ActChgCrsTT1stDay + 237)
/*****************************************************************************/
/******************************** Files tab **********************************/
@@ -1769,7 +1770,7 @@
#define ActLst_NUM_ACTIONS (ActChgMyTT1stDay + 1)
-#define ActLst_MAX_ACTION_COD 1968
+#define ActLst_MAX_ACTION_COD 1969
#define ActLst_DEFAULT_ACTION_AFTER_LOGIN ActSeeGblTL
diff --git a/swad_call_for_exam_resource.c b/swad_call_for_exam_resource.c
index 4cc9d76d..4d559294 100644
--- a/swad_call_for_exam_resource.c
+++ b/swad_call_for_exam_resource.c
@@ -106,7 +106,7 @@ void CfeRsc_WriteResourceCallForExam (long ExaCod,bool PutFormToGo,
else
Ico_PutIconOn (Icon,Ico_BLACK,IconTitle);
- /***** Write Name of the course and date of exam *****/
+ /***** Write title of call for exam *****/
HTM_Txt (Title);
/***** End form to download file *****/
diff --git a/swad_changelog.h b/swad_changelog.h
index 273690ce..c27b8e5f 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -629,10 +629,11 @@ 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.81.2 (2023-03-26)"
+#define Log_PLATFORM_VERSION "SWAD 22.82 (2023-03-27)"
#define CSS_FILE "swad22.78.15.css"
#define JS_FILE "swad22.49.js"
/*
+ Version 22.82: Mar 27, 2023 New module swad_rubric_resource. (338149 lines)
Version 22.81.2: Mar 27, 2023 Changes in resources. (337974 lines)
Version 22.81.1: Mar 26, 2023 Changes in resources. (338012 lines)
5 changes necessary in database:
diff --git a/swad_exam_resource.c b/swad_exam_resource.c
index b4a0b353..92e0b6e9 100644
--- a/swad_exam_resource.c
+++ b/swad_exam_resource.c
@@ -97,7 +97,7 @@ void ExaRsc_WriteResourceExam (long ExaCod,bool PutFormToGo,
else
Ico_PutIconOn (Icon,Ico_BLACK,IconTitle);
- /***** Write Name of the course and date of exam *****/
+ /***** Write title of exam *****/
HTM_Txt (Title);
/***** End form to download file *****/
diff --git a/swad_forum_resource.c b/swad_forum_resource.c
index 03abf4cf..16c4f0b8 100644
--- a/swad_forum_resource.c
+++ b/swad_forum_resource.c
@@ -117,7 +117,7 @@ void ForRsc_WriteResourceThread (long ThrCod,bool PutFormToGo,
else
Ico_PutIconOn (Icon,Ico_BLACK,IconTitle);
- /***** Write Name of the course and date of exam *****/
+ /***** Write title of forum *****/
HTM_Txt (Subject);
/***** End form to download file *****/
diff --git a/swad_resource.c b/swad_resource.c
index 50a197fc..e82d91e6 100644
--- a/swad_resource.c
+++ b/swad_resource.c
@@ -41,6 +41,7 @@
#include "swad_project_resource.h"
#include "swad_resource.h"
#include "swad_role.h"
+#include "swad_rubric_resource.h"
#include "swad_survey_resource.h"
#include "swad_theme.h"
@@ -145,7 +146,7 @@ void Rsc_WriteLinkName (const struct Rsc_Link *Link,bool PutFormToGo,
[Rsc_CALL_FOR_EXAM ] = CfeRsc_WriteResourceCallForExam,
[Rsc_EXAM ] = ExaRsc_WriteResourceExam,
[Rsc_GAME ] = GamRsc_WriteResourceGame,
- [Rsc_RUBRIC ] = Rsc_WriteResourceEmpty, // TODO
+ [Rsc_RUBRIC ] = RubRsc_WriteResourceRubric,
[Rsc_DOCUMENT ] = BrwRsc_WriteResourceDocument,
[Rsc_MARKS ] = BrwRsc_WriteResourceMarksFile,
[Rsc_ATTENDANCE_EVENT] = AttRsc_WriteResourceEvent,
@@ -192,7 +193,7 @@ void Rsc_GetResourceTitleFromLink (struct Rsc_Link *Link,
[Rsc_CALL_FOR_EXAM ] = CfeRsc_GetTitleFromExaCod,
[Rsc_EXAM ] = ExaRsc_GetTitleFromExaCod,
[Rsc_GAME ] = GamRsc_GetTitleFromGamCod,
- [Rsc_RUBRIC ] = NULL, // TODO
+ [Rsc_RUBRIC ] = RubRsc_GetTitleFromRubCod,
[Rsc_DOCUMENT ] = BrwRsc_GetTitleFromDocFilCod,
[Rsc_MARKS ] = BrwRsc_GetTitleFromMrkFilCod,
[Rsc_ATTENDANCE_EVENT] = AttRsc_GetTitleFromAttCod,
diff --git a/swad_rubric.c b/swad_rubric.c
index 115bcf54..90637fae 100644
--- a/swad_rubric.c
+++ b/swad_rubric.c
@@ -260,6 +260,11 @@ static void Rub_PutIconsListRubrics (void *Rubrics)
if (Rub_CheckIfICanEditRubrics ())
Rub_PutIconToCreateNewRubric ((struct Rub_Rubrics *) Rubrics);
+ /***** Link to get resource link *****/
+ if (Rsc_CheckIfICanGetLink ())
+ Ico_PutContextualIconToGetLink (ActReqLnkRub,NULL,
+ Rub_PutPars,Rubrics);
+
/***** Put icon to show a figure *****/
Fig_PutIconToShowFigure (Fig_RUBRICS);
}
@@ -483,6 +488,11 @@ static void Rub_PutIconsToRemEditOneRubric (struct Rub_Rubrics *Rubrics)
/***** Icon to edit rubric *****/
Ico_PutContextualIconToEdit (ActEdiOneRub,NULL,
Rub_PutPars,Rubrics);
+
+ /***** Link to get resource link *****/
+ if (Rsc_CheckIfICanGetLink ())
+ Ico_PutContextualIconToGetLink (ActReqLnkRub,NULL,
+ Rub_PutPars,Rubrics);
}
}
diff --git a/swad_rubric_resource.c b/swad_rubric_resource.c
new file mode 100644
index 00000000..34508aeb
--- /dev/null
+++ b/swad_rubric_resource.c
@@ -0,0 +1,130 @@
+// swad_rubric_resource.c: links to rubrics as resources
+
+/*
+ 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-2023 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 3 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 .
+*/
+/*****************************************************************************/
+/********************************* Headers ***********************************/
+/*****************************************************************************/
+
+#include "swad_action_list.h"
+#include "swad_alert.h"
+#include "swad_error.h"
+#include "swad_form.h"
+#include "swad_parameter_code.h"
+#include "swad_program_database.h"
+#include "swad_rubric.h"
+#include "swad_rubric_database.h"
+#include "swad_rubric_resource.h"
+
+/*****************************************************************************/
+/**************************** Get link to rubric *****************************/
+/*****************************************************************************/
+
+void RubRsc_GetLinkToRubric (void)
+ {
+ extern const char *Txt_Link_to_resource_X_copied_into_clipboard;
+ struct Rub_Rubrics Rubrics;
+ char Title[Rub_MAX_BYTES_TITLE + 1];
+
+ /***** Reset rubrics context *****/
+ Rub_ResetRubrics (&Rubrics);
+
+ /***** Get parameters *****/
+ Rub_GetPars (&Rubrics,true);
+
+ /***** Get rubric title *****/
+ RubRsc_GetTitleFromRubCod (Rubrics.Rubric.RubCod,Title,sizeof (Title) - 1);
+
+ /***** Copy link to rubric into resource clipboard *****/
+ Prg_DB_CopyToClipboard (Rsc_RUBRIC,Rubrics.Rubric.RubCod);
+
+ /***** Write sucess message *****/
+ Ale_ShowAlert (Ale_SUCCESS,Txt_Link_to_resource_X_copied_into_clipboard,
+ Title);
+
+ /***** Show rubrics again *****/
+ Rub_ListAllRubrics (&Rubrics);
+ }
+
+/*****************************************************************************/
+/*************************** Write rubric as resource ************************/
+/*****************************************************************************/
+
+void RubRsc_WriteResourceRubric (long RubCod,bool PutFormToGo,
+ const char *Icon,const char *IconTitle)
+ {
+ extern const char *Txt_Actions[ActLst_NUM_ACTIONS];
+ Act_Action_t NextAction;
+ char Title[Rub_MAX_BYTES_TITLE + 1];
+
+ /***** Get rubric title *****/
+ RubRsc_GetTitleFromRubCod (RubCod,Title,sizeof (Title) - 1);
+
+ /***** Begin form to go to rubric *****/
+ if (PutFormToGo)
+ {
+ NextAction = (RubCod > 0) ? ActSeeRub : // Rubric specified
+ ActSeeAllRub; // All rubrics
+ Frm_BeginForm (NextAction);
+ ParCod_PutPar (ParCod_Rub,RubCod);
+ HTM_BUTTON_Submit_Begin (Txt_Actions[NextAction],
+ "class=\"LM BT_LINK PRG_LNK_%s\"",
+ The_GetSuffix ());
+ }
+
+ /***** Icon depending on type ******/
+ if (PutFormToGo)
+ Ico_PutIconLink (Icon,Ico_BLACK,NextAction);
+ else
+ Ico_PutIconOn (Icon,Ico_BLACK,IconTitle);
+
+ /***** Write title of rubric *****/
+ HTM_Txt (Title);
+
+ /***** End form to download file *****/
+ if (PutFormToGo)
+ {
+ HTM_BUTTON_End ();
+ Frm_EndForm ();
+ }
+ }
+
+/*****************************************************************************/
+/********************* Get rubric title from rubric code *********************/
+/*****************************************************************************/
+// The trailing null character is not counted in TitleSize
+
+void RubRsc_GetTitleFromRubCod (long RubCod,char *Title,size_t TitleSize)
+ {
+ extern const char *Txt_Rubrics;
+ char TitleFromDB[Rub_MAX_BYTES_TITLE + 1];
+
+ if (RubCod > 0)
+ {
+ /***** Get rubric title *****/
+ Rub_DB_GetRubricTitle (RubCod,TitleFromDB);
+ Str_Copy (Title,TitleFromDB,TitleSize);
+ }
+ else
+ /***** Generic title for all rubrics *****/
+ Str_Copy (Title,Txt_Rubrics,TitleSize);
+ }
diff --git a/swad_rubric_resource.h b/swad_rubric_resource.h
new file mode 100644
index 00000000..3371f3a4
--- /dev/null
+++ b/swad_rubric_resource.h
@@ -0,0 +1,41 @@
+// swad_rubric_resource.h: links to rubrics as resources
+
+#ifndef _SWAD_RUB_RSC
+#define _SWAD_RUB_RSC
+/*
+ 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-2023 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 3 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 .
+*/
+/*****************************************************************************/
+/********************************* Headers ***********************************/
+/*****************************************************************************/
+
+#include // For size_t
+
+/*****************************************************************************/
+/***************************** Public prototypes *****************************/
+/*****************************************************************************/
+
+void RubRsc_GetLinkToRubric (void);
+void RubRsc_WriteResourceRubric (long RubCod,bool PutFormToGo,
+ const char *Icon,const char *IconTitle);
+void RubRsc_GetTitleFromRubCod (long RubCod,char *Title,size_t TitleSize);
+
+#endif
diff --git a/swad_survey_resource.c b/swad_survey_resource.c
index 53eaa522..f6847e44 100644
--- a/swad_survey_resource.c
+++ b/swad_survey_resource.c
@@ -97,7 +97,7 @@ void SvyRsc_WriteResourceSurvey (long SvyCod,bool PutFormToGo,
else
Ico_PutIconOn (Icon,Ico_BLACK,IconTitle);
- /***** Write Name of the course and date of exam *****/
+ /***** Write title of survey *****/
HTM_Txt (Title);
/***** End form to download file *****/
diff --git a/swad_text_action.c b/swad_text_action.c
index fa0a2b41..56998476 100644
--- a/swad_text_action.c
+++ b/swad_text_action.c
@@ -14044,6 +14044,29 @@ const char *Txt_Actions[ActLst_NUM_ACTIONS] =
"Remover rubrica"
#elif L==10 // tr
"Puan anahtarını kaldır"
+#endif
+ ,
+ [ActReqLnkRub] =
+#if L==1 // ca
+ "Copiar enllaç a rúbrica"
+#elif L==2 // de
+ "Link zur Rubrik kopieren"
+#elif L==3 // en
+ "Copy link to rubric"
+#elif L==4 // es
+ "Copiar enlace a rúbrica"
+#elif L==5 // fr
+ "Copier le lien vers la rubrique"
+#elif L==6 // gn
+ "Ekopia enlace rubrica-pe"
+#elif L==7 // it
+ "Copiare il link alla rubrica"
+#elif L==8 // pl
+ "Skopiuj link do rubryki"
+#elif L==9 // pt
+ "Copiar link para rubrica"
+#elif L==10 // tr
+ "Bağlantıyı puan anahtarına kopyala"
#endif
,
[ActNewRubCri] =