mirror of https://github.com/acanas/swad-core.git
Version 22.44.3: Oct 12, 2022 Code refactoring in projects.
This commit is contained in:
parent
8922c4d135
commit
c708e089e4
|
@ -606,10 +606,11 @@ TODO: Fix bug: error al enviar un mensaje a dos recipientes, error on duplicate
|
||||||
|
|
||||||
TODO: Attach pdf files in multimedia.
|
TODO: Attach pdf files in multimedia.
|
||||||
*/
|
*/
|
||||||
#define Log_PLATFORM_VERSION "SWAD 22.44.2 (2022-10-12)"
|
#define Log_PLATFORM_VERSION "SWAD 22.44.3 (2022-10-12)"
|
||||||
#define CSS_FILE "swad22.40.css"
|
#define CSS_FILE "swad22.40.css"
|
||||||
#define JS_FILE "swad21.100.js"
|
#define JS_FILE "swad21.100.js"
|
||||||
/*
|
/*
|
||||||
|
Version 22.44.3: Oct 12, 2022 Code refactoring in projects. (333015 lines)
|
||||||
Version 22.44.2: Oct 12, 2022 Code refactoring in projects. (333001 lines)
|
Version 22.44.2: Oct 12, 2022 Code refactoring in projects. (333001 lines)
|
||||||
Version 22.44.1: Oct 12, 2022 Code refactoring in projects. (332985 lines)
|
Version 22.44.1: Oct 12, 2022 Code refactoring in projects. (332985 lines)
|
||||||
Version 22.44: Oct 12, 2022 Code refactoring in projects. (332980 lines)
|
Version 22.44: Oct 12, 2022 Code refactoring in projects. (332980 lines)
|
||||||
|
|
491
swad_project.c
491
swad_project.c
|
@ -200,20 +200,41 @@ static void Prj_PutIconsOnePrj (void *Projects);
|
||||||
static void Prj_ShowProjectRow (struct Prj_Projects *Projects,
|
static void Prj_ShowProjectRow (struct Prj_Projects *Projects,
|
||||||
unsigned NumIndex);
|
unsigned NumIndex);
|
||||||
static void Prj_ShowProjectFirstRow (struct Prj_Projects *Projects,
|
static void Prj_ShowProjectFirstRow (struct Prj_Projects *Projects,
|
||||||
|
const char *ClassData,
|
||||||
const struct Prj_Faults *Faults,
|
const struct Prj_Faults *Faults,
|
||||||
unsigned NumIndex,unsigned UniqueId);
|
unsigned NumIndex,unsigned UniqueId);
|
||||||
static void Prj_ShowProjectReviewStatus (const struct Prj_Projects *Projects);
|
static void Prj_ShowProjectDepartment (const struct Prj_Projects *Projects,
|
||||||
|
const char *ClassData);
|
||||||
|
static void Prj_ShowProjectReviewStatus (const struct Prj_Projects *Projects,
|
||||||
|
const char *ClassLabel,
|
||||||
|
const char *ClassData);
|
||||||
static void Prj_ShowProjectAssigned (const struct Prj_Projects *Projects,
|
static void Prj_ShowProjectAssigned (const struct Prj_Projects *Projects,
|
||||||
|
const char *ClassLabel,
|
||||||
|
const char *ClassData,
|
||||||
const struct Prj_Faults *Faults);
|
const struct Prj_Faults *Faults);
|
||||||
static void Prj_ShowProjectNumStds (const struct Prj_Projects *Projects,
|
static void Prj_ShowProjectNumStds (const struct Prj_Projects *Projects,
|
||||||
|
const char *ClassLabel,
|
||||||
|
const char *ClassData,
|
||||||
const struct Prj_Faults *Faults);
|
const struct Prj_Faults *Faults);
|
||||||
static void Prj_ShowProjectMembers (struct Prj_Projects *Projects);
|
static void Prj_ShowProjectMembers (struct Prj_Projects *Projects);
|
||||||
static void Prj_ShowProjectMembersWithARole (struct Prj_Projects *Projects,
|
static void Prj_ShowProjectMembersWithARole (struct Prj_Projects *Projects,
|
||||||
Prj_RoleInProject_t RoleInPrj);
|
Prj_RoleInProject_t RoleInPrj);
|
||||||
static void Prj_ShowOneProjectLinkToShowHiddenInfo (const struct Prj_Projects *Projects,
|
static void Prj_ShowProjectLinkToShowHiddenInfo (const struct Prj_Projects *Projects,
|
||||||
unsigned UniqueId);
|
unsigned UniqueId);
|
||||||
static void Prj_ShowOneProjectProposal (const struct Prj_Projects *Projects,
|
static void Prj_ShowProjectProposal (const struct Prj_Projects *Projects,
|
||||||
unsigned UniqueId);
|
const char *ClassLabel,
|
||||||
|
const char *ClassData,
|
||||||
|
unsigned UniqueId);
|
||||||
|
static void Prj_ShowProjectTxtField (const struct Prj_Projects *Projects,
|
||||||
|
const char *ClassLabel,
|
||||||
|
const char *ClassData,
|
||||||
|
const char *id,unsigned UniqueId,
|
||||||
|
const char *Label,char *TxtField,
|
||||||
|
bool Warning);
|
||||||
|
static void Prj_ShowProjectURL (const struct Prj_Projects *Projects,
|
||||||
|
const char *ClassLabel,
|
||||||
|
const char *ClassData,
|
||||||
|
const char *id,unsigned UniqueId);
|
||||||
|
|
||||||
//------------------------------------------------ ----------------------------
|
//------------------------------------------------ ----------------------------
|
||||||
static void Prj_CheckIfPrjIsFaulty (long PrjCod,struct Prj_Faults *Faults);
|
static void Prj_CheckIfPrjIsFaulty (long PrjCod,struct Prj_Faults *Faults);
|
||||||
|
@ -221,16 +242,9 @@ static void Prj_PutWarningIcon (void);
|
||||||
static void Prj_PutIconToToggleProject (unsigned UniqueId,
|
static void Prj_PutIconToToggleProject (unsigned UniqueId,
|
||||||
const char *Icon,const char *Text);
|
const char *Icon,const char *Text);
|
||||||
static void Prj_ShowTableAllProjectsOneRow (struct Prj_Project *Prj);
|
static void Prj_ShowTableAllProjectsOneRow (struct Prj_Project *Prj);
|
||||||
static void Prj_ShowOneProjectDepartment (const struct Prj_Projects *Projects);
|
|
||||||
static void Prj_ShowTableAllProjectsDepartment (const struct Prj_Project *Prj);
|
static void Prj_ShowTableAllProjectsDepartment (const struct Prj_Project *Prj);
|
||||||
static void Prj_ShowOneProjectTxtField (const struct Prj_Projects *Projects,
|
|
||||||
const char *id,unsigned UniqueId,
|
|
||||||
const char *Label,char *TxtField,
|
|
||||||
bool Warning);
|
|
||||||
static void Prj_ShowTableAllProjectsTxtField (struct Prj_Project *Prj,
|
static void Prj_ShowTableAllProjectsTxtField (struct Prj_Project *Prj,
|
||||||
char *TxtField);
|
char *TxtField);
|
||||||
static void Prj_ShowOneProjectURL (const struct Prj_Projects *Projects,
|
|
||||||
const char *id,unsigned UniqueId);
|
|
||||||
static void Prj_ShowTableAllProjectsURL (const struct Prj_Project *Prj);
|
static void Prj_ShowTableAllProjectsURL (const struct Prj_Project *Prj);
|
||||||
static void Prj_ShowTableAllProjectsMembersWithARole (const struct Prj_Project *Prj,
|
static void Prj_ShowTableAllProjectsMembersWithARole (const struct Prj_Project *Prj,
|
||||||
Prj_RoleInProject_t RoleInPrj);
|
Prj_RoleInProject_t RoleInPrj);
|
||||||
|
@ -1361,50 +1375,57 @@ static void Prj_ShowProjectRow (struct Prj_Projects *Projects,
|
||||||
extern const char *Txt_Required_materials;
|
extern const char *Txt_Required_materials;
|
||||||
struct Prj_Faults Faults;
|
struct Prj_Faults Faults;
|
||||||
static unsigned UniqueId = 0;
|
static unsigned UniqueId = 0;
|
||||||
|
const char *ClassLabel = (Projects->Prj.Hidden == Prj_HIDDEN) ? "ASG_LABEL_LIGHT" :
|
||||||
|
"ASG_LABEL";
|
||||||
|
const char *ClassData = (Projects->Prj.Hidden == Prj_HIDDEN) ? "DAT_LIGHT" :
|
||||||
|
"DAT";
|
||||||
|
|
||||||
/***** Check project faults *****/
|
/***** Check project faults *****/
|
||||||
Prj_CheckIfPrjIsFaulty (Projects->Prj.PrjCod,&Faults);
|
Prj_CheckIfPrjIsFaulty (Projects->Prj.PrjCod,&Faults);
|
||||||
|
|
||||||
/***** First row with main data (dates, title...) *****/
|
/***** First row with main data (dates, title...) *****/
|
||||||
UniqueId++;
|
UniqueId++;
|
||||||
Prj_ShowProjectFirstRow (Projects,&Faults,NumIndex,UniqueId);
|
Prj_ShowProjectFirstRow (Projects,ClassData,&Faults,NumIndex,UniqueId);
|
||||||
|
|
||||||
/***** Review status *****/
|
/***** Review status *****/
|
||||||
Prj_ShowProjectReviewStatus (Projects);
|
Prj_ShowProjectReviewStatus (Projects,ClassLabel,ClassData);
|
||||||
|
|
||||||
/***** Assigned? *****/
|
/***** Assigned? *****/
|
||||||
Prj_ShowProjectAssigned (Projects,&Faults);
|
Prj_ShowProjectAssigned (Projects,ClassLabel,ClassData,&Faults);
|
||||||
|
|
||||||
/***** Number of students *****/
|
/***** Number of students *****/
|
||||||
Prj_ShowProjectNumStds (Projects,&Faults);
|
Prj_ShowProjectNumStds (Projects,ClassLabel,ClassData,&Faults);
|
||||||
|
|
||||||
/***** Project members *****/
|
/***** Project members *****/
|
||||||
Prj_ShowProjectMembers (Projects);
|
Prj_ShowProjectMembers (Projects);
|
||||||
|
|
||||||
/***** Link to show hidden info *****/
|
/***** Link to show hidden info *****/
|
||||||
Prj_ShowOneProjectLinkToShowHiddenInfo (Projects,UniqueId);
|
Prj_ShowProjectLinkToShowHiddenInfo (Projects,UniqueId);
|
||||||
|
|
||||||
/***** Proposal *****/
|
/***** Proposal *****/
|
||||||
Prj_ShowOneProjectProposal (Projects,UniqueId);
|
Prj_ShowProjectProposal (Projects,ClassLabel,ClassData,UniqueId);
|
||||||
|
|
||||||
/***** Write rows of data of this project *****/
|
/***** Write rows of data of this project *****/
|
||||||
/* Description of the project */
|
/* Description of the project */
|
||||||
Prj_ShowOneProjectTxtField (Projects,"prj_dsc_",UniqueId,
|
Prj_ShowProjectTxtField (Projects,ClassLabel,ClassData,"prj_dsc_",UniqueId,
|
||||||
Txt_Description,Projects->Prj.Description,
|
Txt_Description,
|
||||||
Faults.WrongDescription);
|
Projects->Prj.Description,
|
||||||
|
Faults.WrongDescription);
|
||||||
|
|
||||||
/* Required knowledge to carry out the project */
|
/* Required knowledge to carry out the project */
|
||||||
Prj_ShowOneProjectTxtField (Projects,"prj_knw_",UniqueId,
|
Prj_ShowProjectTxtField (Projects,ClassLabel,ClassData,"prj_knw_",UniqueId,
|
||||||
Txt_Required_knowledge,Projects->Prj.Knowledge,
|
Txt_Required_knowledge,
|
||||||
false); // No warning
|
Projects->Prj.Knowledge,
|
||||||
|
false); // No warning
|
||||||
|
|
||||||
/* Required materials to carry out the project */
|
/* Required materials to carry out the project */
|
||||||
Prj_ShowOneProjectTxtField (Projects,"prj_mtr_",UniqueId,
|
Prj_ShowProjectTxtField (Projects,ClassLabel,ClassData,"prj_mtr_",UniqueId,
|
||||||
Txt_Required_materials,Projects->Prj.Materials,
|
Txt_Required_materials,
|
||||||
false); // No warning
|
Projects->Prj.Materials,
|
||||||
|
false); // No warning
|
||||||
|
|
||||||
/* Link to view more info about the project */
|
/* Link to view more info about the project */
|
||||||
Prj_ShowOneProjectURL (Projects,"prj_url_",UniqueId);
|
Prj_ShowProjectURL (Projects,ClassLabel,ClassData,"prj_url_",UniqueId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1412,6 +1433,7 @@ static void Prj_ShowProjectRow (struct Prj_Projects *Projects,
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prj_ShowProjectFirstRow (struct Prj_Projects *Projects,
|
static void Prj_ShowProjectFirstRow (struct Prj_Projects *Projects,
|
||||||
|
const char *ClassData,
|
||||||
const struct Prj_Faults *Faults,
|
const struct Prj_Faults *Faults,
|
||||||
unsigned NumIndex,unsigned UniqueId)
|
unsigned NumIndex,unsigned UniqueId)
|
||||||
{
|
{
|
||||||
|
@ -1539,7 +1561,7 @@ static void Prj_ShowProjectFirstRow (struct Prj_Projects *Projects,
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
/* Department */
|
/* Department */
|
||||||
Prj_ShowOneProjectDepartment (Projects);
|
Prj_ShowProjectDepartment (Projects,ClassData);
|
||||||
|
|
||||||
HTM_TR_End ();
|
HTM_TR_End ();
|
||||||
|
|
||||||
|
@ -1547,18 +1569,55 @@ static void Prj_ShowProjectFirstRow (struct Prj_Projects *Projects,
|
||||||
Frm_FreeAnchorStr (Anchor);
|
Frm_FreeAnchorStr (Anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********** When listing a project, show first row with department ***********/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void Prj_ShowProjectDepartment (const struct Prj_Projects *Projects,
|
||||||
|
const char *ClassData)
|
||||||
|
{
|
||||||
|
struct Dpt_Department Dpt;
|
||||||
|
bool PutLink;
|
||||||
|
|
||||||
|
/***** Get data of department *****/
|
||||||
|
Dpt.DptCod = Projects->Prj.DptCod;
|
||||||
|
Dpt_GetDataOfDepartmentByCod (&Dpt);
|
||||||
|
|
||||||
|
/***** Show department *****/
|
||||||
|
PutLink = (Dpt.WWW[0] &&
|
||||||
|
(Projects->View == Prj_LIST_PROJECTS ||
|
||||||
|
Projects->View == Prj_FILE_BROWSER_PROJECT));
|
||||||
|
|
||||||
|
switch (Projects->View)
|
||||||
|
{
|
||||||
|
case Prj_LIST_PROJECTS:
|
||||||
|
HTM_TD_Begin ("class=\"LT %s_%s %s\"",
|
||||||
|
ClassData,The_GetSuffix (),The_GetColorRows ());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
HTM_TD_Begin ("class=\"LT %s_%s\"",
|
||||||
|
ClassData,The_GetSuffix ());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (PutLink)
|
||||||
|
HTM_A_Begin ("href=\"%s\" target=\"_blank\" class=\"%s_%s\"",
|
||||||
|
Dpt.WWW,ClassData,The_GetSuffix ());
|
||||||
|
HTM_Txt (Dpt.FullName);
|
||||||
|
if (PutLink)
|
||||||
|
HTM_A_End ();
|
||||||
|
HTM_TD_End ();
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/********* When listing a project, show one row with review status ***********/
|
/********* When listing a project, show one row with review status ***********/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prj_ShowProjectReviewStatus (const struct Prj_Projects *Projects)
|
static void Prj_ShowProjectReviewStatus (const struct Prj_Projects *Projects,
|
||||||
|
const char *ClassLabel,
|
||||||
|
const char *ClassData)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Review;
|
extern const char *Txt_Review;
|
||||||
extern const char *Txt_PROJECT_REVIEW_SINGUL[Prj_NUM_REVIEW_STATUS];
|
extern const char *Txt_PROJECT_REVIEW_SINGUL[Prj_NUM_REVIEW_STATUS];
|
||||||
const char *ClassLabel = (Projects->Prj.Hidden == Prj_HIDDEN) ? "ASG_LABEL_LIGHT" :
|
|
||||||
"ASG_LABEL";
|
|
||||||
const char *ClassData = (Projects->Prj.Hidden == Prj_HIDDEN) ? "DAT_LIGHT" :
|
|
||||||
"DAT";
|
|
||||||
|
|
||||||
HTM_TR_Begin (NULL);
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
@ -1587,10 +1646,10 @@ static void Prj_ShowProjectReviewStatus (const struct Prj_Projects *Projects)
|
||||||
ClassData,The_GetSuffix ());
|
ClassData,The_GetSuffix ());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
HTM_TxtF ("%s ",Txt_PROJECT_REVIEW_SINGUL[Projects->Prj.ReviewStatus]);
|
HTM_TxtF ("%s ",Txt_PROJECT_REVIEW_SINGUL[Projects->Prj.Review.Status]);
|
||||||
Ico_PutIconOff (ReviewIcon[Projects->Prj.ReviewStatus].Icon,
|
Ico_PutIconOff (ReviewIcon[Projects->Prj.Review.Status].Icon,
|
||||||
ReviewIcon[Projects->Prj.ReviewStatus].Color,
|
ReviewIcon[Projects->Prj.Review.Status].Color,
|
||||||
Txt_PROJECT_REVIEW_SINGUL[Projects->Prj.ReviewStatus]);
|
Txt_PROJECT_REVIEW_SINGUL[Projects->Prj.Review.Status]);
|
||||||
/*
|
/*
|
||||||
if (Faults.WrongAssigned)
|
if (Faults.WrongAssigned)
|
||||||
Prj_PutWarningIcon ();
|
Prj_PutWarningIcon ();
|
||||||
|
@ -1606,16 +1665,14 @@ static void Prj_ShowProjectReviewStatus (const struct Prj_Projects *Projects)
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prj_ShowProjectAssigned (const struct Prj_Projects *Projects,
|
static void Prj_ShowProjectAssigned (const struct Prj_Projects *Projects,
|
||||||
|
const char *ClassLabel,
|
||||||
|
const char *ClassData,
|
||||||
const struct Prj_Faults *Faults)
|
const struct Prj_Faults *Faults)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Assigned_QUESTION;
|
extern const char *Txt_Assigned_QUESTION;
|
||||||
extern const char *Txt_Yes;
|
extern const char *Txt_Yes;
|
||||||
extern const char *Txt_No;
|
extern const char *Txt_No;
|
||||||
extern const char *Txt_PROJECT_ASSIGNED_NONASSIGNED_SINGUL[Prj_NUM_ASSIGNED_NONASSIG];
|
extern const char *Txt_PROJECT_ASSIGNED_NONASSIGNED_SINGUL[Prj_NUM_ASSIGNED_NONASSIG];
|
||||||
const char *ClassLabel = (Projects->Prj.Hidden == Prj_HIDDEN) ? "ASG_LABEL_LIGHT" :
|
|
||||||
"ASG_LABEL";
|
|
||||||
const char *ClassData = (Projects->Prj.Hidden == Prj_HIDDEN) ? "DAT_LIGHT" :
|
|
||||||
"DAT";
|
|
||||||
|
|
||||||
HTM_TR_Begin (NULL);
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
@ -1662,13 +1719,11 @@ static void Prj_ShowProjectAssigned (const struct Prj_Projects *Projects,
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prj_ShowProjectNumStds (const struct Prj_Projects *Projects,
|
static void Prj_ShowProjectNumStds (const struct Prj_Projects *Projects,
|
||||||
|
const char *ClassLabel,
|
||||||
|
const char *ClassData,
|
||||||
const struct Prj_Faults *Faults)
|
const struct Prj_Faults *Faults)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Number_of_students;
|
extern const char *Txt_Number_of_students;
|
||||||
const char *ClassLabel = (Projects->Prj.Hidden == Prj_HIDDEN) ? "ASG_LABEL_LIGHT" :
|
|
||||||
"ASG_LABEL";
|
|
||||||
const char *ClassData = (Projects->Prj.Hidden == Prj_HIDDEN) ? "DAT_LIGHT" :
|
|
||||||
"DAT";
|
|
||||||
|
|
||||||
HTM_TR_Begin (NULL);
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
@ -1902,8 +1957,8 @@ static void Prj_ShowProjectMembersWithARole (struct Prj_Projects *Projects,
|
||||||
/***** When listing a project, show one row with link to show hidden info ****/
|
/***** When listing a project, show one row with link to show hidden info ****/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prj_ShowOneProjectLinkToShowHiddenInfo (const struct Prj_Projects *Projects,
|
static void Prj_ShowProjectLinkToShowHiddenInfo (const struct Prj_Projects *Projects,
|
||||||
unsigned UniqueId)
|
unsigned UniqueId)
|
||||||
{
|
{
|
||||||
extern const char *Txt_See_more;
|
extern const char *Txt_See_more;
|
||||||
extern const char *Txt_See_less;
|
extern const char *Txt_See_less;
|
||||||
|
@ -1947,15 +2002,13 @@ static void Prj_ShowOneProjectLinkToShowHiddenInfo (const struct Prj_Projects *P
|
||||||
/********* When listing a project, show one row with type of proposal ********/
|
/********* When listing a project, show one row with type of proposal ********/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prj_ShowOneProjectProposal (const struct Prj_Projects *Projects,
|
static void Prj_ShowProjectProposal (const struct Prj_Projects *Projects,
|
||||||
unsigned UniqueId)
|
const char *ClassLabel,
|
||||||
|
const char *ClassData,
|
||||||
|
unsigned UniqueId)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Proposal;
|
extern const char *Txt_Proposal;
|
||||||
extern const char *Txt_PROJECT_STATUS[Prj_NUM_PROPOSAL_TYPES];
|
extern const char *Txt_PROJECT_STATUS[Prj_NUM_PROPOSAL_TYPES];
|
||||||
const char *ClassLabel = (Projects->Prj.Hidden == Prj_HIDDEN) ? "ASG_LABEL_LIGHT" :
|
|
||||||
"ASG_LABEL";
|
|
||||||
const char *ClassData = (Projects->Prj.Hidden == Prj_HIDDEN) ? "DAT_LIGHT" :
|
|
||||||
"DAT";
|
|
||||||
|
|
||||||
switch (Projects->View)
|
switch (Projects->View)
|
||||||
{
|
{
|
||||||
|
@ -1996,6 +2049,137 @@ static void Prj_ShowOneProjectProposal (const struct Prj_Projects *Projects,
|
||||||
HTM_TR_End ();
|
HTM_TR_End ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********** When listing a project, show one row with a text field ***********/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void Prj_ShowProjectTxtField (const struct Prj_Projects *Projects,
|
||||||
|
const char *ClassLabel,
|
||||||
|
const char *ClassData,
|
||||||
|
const char *id,unsigned UniqueId,
|
||||||
|
const char *Label,char *TxtField,
|
||||||
|
bool Warning)
|
||||||
|
{
|
||||||
|
/***** Label *****/
|
||||||
|
switch (Projects->View)
|
||||||
|
{
|
||||||
|
case Prj_LIST_PROJECTS:
|
||||||
|
HTM_TR_Begin ("id=\"%s%u\" style=\"display:none;\"",id,UniqueId);
|
||||||
|
HTM_TD_Begin ("colspan=\"4\" class=\"RT %s_%s %s\"",
|
||||||
|
ClassLabel,The_GetSuffix (),The_GetColorRows ());
|
||||||
|
break;
|
||||||
|
case Prj_FILE_BROWSER_PROJECT:
|
||||||
|
HTM_TR_Begin ("id=\"%s%u\" style=\"display:none;\"",id,UniqueId);
|
||||||
|
HTM_TD_Begin ("colspan=\"2\" class=\"RT %s_%s\"",
|
||||||
|
ClassLabel,The_GetSuffix ());
|
||||||
|
break;
|
||||||
|
case Prj_PRINT_ONE_PROJECT:
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
HTM_TD_Begin ("colspan=\"2\" class=\"RT %s_%s\"",
|
||||||
|
ClassLabel,The_GetSuffix ());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Not applicable
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
HTM_TxtColon (Label);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/***** Change text format *****/
|
||||||
|
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
|
||||||
|
TxtField,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to recpectful HTML
|
||||||
|
switch (Projects->View)
|
||||||
|
{
|
||||||
|
case Prj_LIST_PROJECTS:
|
||||||
|
case Prj_FILE_BROWSER_PROJECT:
|
||||||
|
ALn_InsertLinks (TxtField,Cns_MAX_BYTES_TEXT,60); // Insert links
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***** Text *****/
|
||||||
|
switch (Projects->View)
|
||||||
|
{
|
||||||
|
case Prj_LIST_PROJECTS:
|
||||||
|
HTM_TD_Begin ("colspan=\"2\" class=\"LT %s_%s %s\"",
|
||||||
|
ClassData,The_GetSuffix (),
|
||||||
|
The_GetColorRows ());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
HTM_TD_Begin ("colspan=\"2\" class=\"LT %s_%s\"",
|
||||||
|
ClassData,The_GetSuffix ());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
HTM_Txt (TxtField);
|
||||||
|
if (Warning)
|
||||||
|
Prj_PutWarningIcon ();
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************** When listing a project, show one row with URL ****************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void Prj_ShowProjectURL (const struct Prj_Projects *Projects,
|
||||||
|
const char *ClassLabel,
|
||||||
|
const char *ClassData,
|
||||||
|
const char *id,unsigned UniqueId)
|
||||||
|
{
|
||||||
|
extern const char *Txt_URL;
|
||||||
|
bool PutLink = (Projects->Prj.URL[0] &&
|
||||||
|
(Projects->View == Prj_LIST_PROJECTS ||
|
||||||
|
Projects->View == Prj_FILE_BROWSER_PROJECT));
|
||||||
|
|
||||||
|
/***** Write row with label and text *****/
|
||||||
|
switch (Projects->View)
|
||||||
|
{
|
||||||
|
case Prj_LIST_PROJECTS:
|
||||||
|
HTM_TR_Begin ("id=\"%s%u\" style=\"display:none;\"",id,UniqueId);
|
||||||
|
HTM_TD_Begin ("colspan=\"4\" class=\"RT %s_%s %s\"",
|
||||||
|
ClassLabel,The_GetSuffix (),The_GetColorRows ());
|
||||||
|
break;
|
||||||
|
case Prj_FILE_BROWSER_PROJECT:
|
||||||
|
HTM_TR_Begin ("id=\"%s%u\" style=\"display:none;\"",id,UniqueId);
|
||||||
|
HTM_TD_Begin ("colspan=\"2\" class=\"RT %s_%s\"",
|
||||||
|
ClassLabel,The_GetSuffix ());
|
||||||
|
break;
|
||||||
|
case Prj_PRINT_ONE_PROJECT:
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
HTM_TD_Begin ("colspan=\"2\" class=\"RT %s_%s\"",
|
||||||
|
ClassLabel,The_GetSuffix ());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Not applicable
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
HTM_TxtColon (Txt_URL);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
switch (Projects->View)
|
||||||
|
{
|
||||||
|
case Prj_LIST_PROJECTS:
|
||||||
|
HTM_TD_Begin ("colspan=\"2\" class=\"LT %s_%s %s\"",
|
||||||
|
ClassData,The_GetSuffix (),
|
||||||
|
The_GetColorRows ());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
HTM_TD_Begin ("colspan=\"2\" class=\"LT %s_%s\"",
|
||||||
|
ClassData,The_GetSuffix ());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (PutLink)
|
||||||
|
HTM_A_Begin ("href=\"%s\" target=\"_blank\"",Projects->Prj.URL);
|
||||||
|
HTM_Txt (Projects->Prj.URL);
|
||||||
|
if (PutLink)
|
||||||
|
HTM_A_End ();
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/********************** Check if a project has faults ************************/
|
/********************** Check if a project has faults ************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -2202,45 +2386,6 @@ static void Prj_ShowTableAllProjectsOneRow (struct Prj_Project *Prj)
|
||||||
/****************** Show department associated to project ********************/
|
/****************** Show department associated to project ********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prj_ShowOneProjectDepartment (const struct Prj_Projects *Projects)
|
|
||||||
{
|
|
||||||
struct Dpt_Department Dpt;
|
|
||||||
bool PutLink;
|
|
||||||
const char *ClassData;
|
|
||||||
|
|
||||||
/***** Set CSS classes *****/
|
|
||||||
ClassData = (Projects->Prj.Hidden == Prj_HIDDEN) ? "DAT_LIGHT" :
|
|
||||||
"DAT";
|
|
||||||
|
|
||||||
/***** Get data of department *****/
|
|
||||||
Dpt.DptCod = Projects->Prj.DptCod;
|
|
||||||
Dpt_GetDataOfDepartmentByCod (&Dpt);
|
|
||||||
|
|
||||||
/***** Show department *****/
|
|
||||||
PutLink = (Dpt.WWW[0] &&
|
|
||||||
(Projects->View == Prj_LIST_PROJECTS ||
|
|
||||||
Projects->View == Prj_FILE_BROWSER_PROJECT));
|
|
||||||
|
|
||||||
switch (Projects->View)
|
|
||||||
{
|
|
||||||
case Prj_LIST_PROJECTS:
|
|
||||||
HTM_TD_Begin ("class=\"LT %s_%s %s\"",
|
|
||||||
ClassData,The_GetSuffix (),The_GetColorRows ());
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
HTM_TD_Begin ("class=\"LT %s_%s\"",
|
|
||||||
ClassData,The_GetSuffix ());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (PutLink)
|
|
||||||
HTM_A_Begin ("href=\"%s\" target=\"_blank\" class=\"%s_%s\"",
|
|
||||||
Dpt.WWW,ClassData,The_GetSuffix ());
|
|
||||||
HTM_Txt (Dpt.FullName);
|
|
||||||
if (PutLink)
|
|
||||||
HTM_A_End ();
|
|
||||||
HTM_TD_End ();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void Prj_ShowTableAllProjectsDepartment (const struct Prj_Project *Prj)
|
static void Prj_ShowTableAllProjectsDepartment (const struct Prj_Project *Prj)
|
||||||
{
|
{
|
||||||
struct Dpt_Department Dpt;
|
struct Dpt_Department Dpt;
|
||||||
|
@ -2262,82 +2407,9 @@ static void Prj_ShowTableAllProjectsDepartment (const struct Prj_Project *Prj)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/********************** Show text field about a project **********************/
|
/*********************** Show text field in a project ************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prj_ShowOneProjectTxtField (const struct Prj_Projects *Projects,
|
|
||||||
const char *id,unsigned UniqueId,
|
|
||||||
const char *Label,char *TxtField,
|
|
||||||
bool Warning)
|
|
||||||
{
|
|
||||||
const char *ClassLabel;
|
|
||||||
const char *ClassData;
|
|
||||||
|
|
||||||
/***** Set CSS classes *****/
|
|
||||||
ClassLabel = (Projects->Prj.Hidden == Prj_HIDDEN) ? "ASG_LABEL_LIGHT" :
|
|
||||||
"ASG_LABEL";
|
|
||||||
ClassData = (Projects->Prj.Hidden == Prj_HIDDEN) ? "DAT_LIGHT" :
|
|
||||||
"DAT";
|
|
||||||
|
|
||||||
/***** Label *****/
|
|
||||||
switch (Projects->View)
|
|
||||||
{
|
|
||||||
case Prj_LIST_PROJECTS:
|
|
||||||
HTM_TR_Begin ("id=\"%s%u\" style=\"display:none;\"",id,UniqueId);
|
|
||||||
HTM_TD_Begin ("colspan=\"4\" class=\"RT %s_%s %s\"",
|
|
||||||
ClassLabel,The_GetSuffix (),The_GetColorRows ());
|
|
||||||
break;
|
|
||||||
case Prj_FILE_BROWSER_PROJECT:
|
|
||||||
HTM_TR_Begin ("id=\"%s%u\" style=\"display:none;\"",id,UniqueId);
|
|
||||||
HTM_TD_Begin ("colspan=\"2\" class=\"RT %s_%s\"",
|
|
||||||
ClassLabel,The_GetSuffix ());
|
|
||||||
break;
|
|
||||||
case Prj_PRINT_ONE_PROJECT:
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
HTM_TD_Begin ("colspan=\"2\" class=\"RT %s_%s\"",
|
|
||||||
ClassLabel,The_GetSuffix ());
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// Not applicable
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
HTM_TxtColon (Label);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
/***** Change text format *****/
|
|
||||||
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
|
|
||||||
TxtField,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to recpectful HTML
|
|
||||||
switch (Projects->View)
|
|
||||||
{
|
|
||||||
case Prj_LIST_PROJECTS:
|
|
||||||
case Prj_FILE_BROWSER_PROJECT:
|
|
||||||
ALn_InsertLinks (TxtField,Cns_MAX_BYTES_TEXT,60); // Insert links
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Text *****/
|
|
||||||
switch (Projects->View)
|
|
||||||
{
|
|
||||||
case Prj_LIST_PROJECTS:
|
|
||||||
HTM_TD_Begin ("colspan=\"2\" class=\"LT %s_%s %s\"",
|
|
||||||
ClassData,The_GetSuffix (),
|
|
||||||
The_GetColorRows ());
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
HTM_TD_Begin ("colspan=\"2\" class=\"LT %s_%s\"",
|
|
||||||
ClassData,The_GetSuffix ());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
HTM_Txt (TxtField);
|
|
||||||
if (Warning)
|
|
||||||
Prj_PutWarningIcon ();
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void Prj_ShowTableAllProjectsTxtField (struct Prj_Project *Prj,
|
static void Prj_ShowTableAllProjectsTxtField (struct Prj_Project *Prj,
|
||||||
char *TxtField)
|
char *TxtField)
|
||||||
{
|
{
|
||||||
|
@ -2362,69 +2434,6 @@ static void Prj_ShowTableAllProjectsTxtField (struct Prj_Project *Prj,
|
||||||
/********************** Show URL associated to project ***********************/
|
/********************** Show URL associated to project ***********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prj_ShowOneProjectURL (const struct Prj_Projects *Projects,
|
|
||||||
const char *id,unsigned UniqueId)
|
|
||||||
{
|
|
||||||
extern const char *Txt_URL;
|
|
||||||
const char *ClassLabel;
|
|
||||||
const char *ClassData;
|
|
||||||
bool PutLink = (Projects->Prj.URL[0] &&
|
|
||||||
(Projects->View == Prj_LIST_PROJECTS ||
|
|
||||||
Projects->View == Prj_FILE_BROWSER_PROJECT));
|
|
||||||
|
|
||||||
/***** Set CSS classes *****/
|
|
||||||
ClassLabel = (Projects->Prj.Hidden == Prj_HIDDEN) ? "ASG_LABEL_LIGHT" :
|
|
||||||
"ASG_LABEL";
|
|
||||||
ClassData = (Projects->Prj.Hidden == Prj_HIDDEN) ? "DAT_LIGHT" :
|
|
||||||
"DAT";
|
|
||||||
|
|
||||||
/***** Write row with label and text *****/
|
|
||||||
switch (Projects->View)
|
|
||||||
{
|
|
||||||
case Prj_LIST_PROJECTS:
|
|
||||||
HTM_TR_Begin ("id=\"%s%u\" style=\"display:none;\"",id,UniqueId);
|
|
||||||
HTM_TD_Begin ("colspan=\"4\" class=\"RT %s_%s %s\"",
|
|
||||||
ClassLabel,The_GetSuffix (),The_GetColorRows ());
|
|
||||||
break;
|
|
||||||
case Prj_FILE_BROWSER_PROJECT:
|
|
||||||
HTM_TR_Begin ("id=\"%s%u\" style=\"display:none;\"",id,UniqueId);
|
|
||||||
HTM_TD_Begin ("colspan=\"2\" class=\"RT %s_%s\"",
|
|
||||||
ClassLabel,The_GetSuffix ());
|
|
||||||
break;
|
|
||||||
case Prj_PRINT_ONE_PROJECT:
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
HTM_TD_Begin ("colspan=\"2\" class=\"RT %s_%s\"",
|
|
||||||
ClassLabel,The_GetSuffix ());
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// Not applicable
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
HTM_TxtColon (Txt_URL);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
switch (Projects->View)
|
|
||||||
{
|
|
||||||
case Prj_LIST_PROJECTS:
|
|
||||||
HTM_TD_Begin ("colspan=\"2\" class=\"LT %s_%s %s\"",
|
|
||||||
ClassData,The_GetSuffix (),
|
|
||||||
The_GetColorRows ());
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
HTM_TD_Begin ("colspan=\"2\" class=\"LT %s_%s\"",
|
|
||||||
ClassData,The_GetSuffix ());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (PutLink)
|
|
||||||
HTM_A_Begin ("href=\"%s\" target=\"_blank\"",Projects->Prj.URL);
|
|
||||||
HTM_Txt (Projects->Prj.URL);
|
|
||||||
if (PutLink)
|
|
||||||
HTM_A_End ();
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void Prj_ShowTableAllProjectsURL (const struct Prj_Project *Prj)
|
static void Prj_ShowTableAllProjectsURL (const struct Prj_Project *Prj)
|
||||||
{
|
{
|
||||||
const char *ClassData;
|
const char *ClassData;
|
||||||
|
@ -3180,17 +3189,17 @@ void Prj_GetDataOfProjectByCod (struct Prj_Project *Prj)
|
||||||
|
|
||||||
/* Get review status (row[15]), review time (row[16])
|
/* Get review status (row[15]), review time (row[16])
|
||||||
and review text (row[17]) */
|
and review text (row[17]) */
|
||||||
Prj->ReviewStatus = Prj_REVIEW_STATUS_DEFAULT;
|
Prj->Review.Status = Prj_REVIEW_STATUS_DEFAULT;
|
||||||
for (ReviewStatus = (Prj_ReviewStatus_t) 0;
|
for (ReviewStatus = (Prj_ReviewStatus_t) 0;
|
||||||
ReviewStatus <= (Prj_ReviewStatus_t) (Prj_NUM_REVIEW_STATUS - 1);
|
ReviewStatus <= (Prj_ReviewStatus_t) (Prj_NUM_REVIEW_STATUS - 1);
|
||||||
ReviewStatus++)
|
ReviewStatus++)
|
||||||
if (!strcmp (Prj_ReviewStatus_DB[ReviewStatus],row[15]))
|
if (!strcmp (Prj_ReviewStatus_DB[ReviewStatus],row[15]))
|
||||||
{
|
{
|
||||||
Prj->ReviewStatus = ReviewStatus;
|
Prj->Review.Status = ReviewStatus;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Prj->ReviewTime = Dat_GetUNIXTimeFromStr (row[16]);
|
Prj->Review.Time = Dat_GetUNIXTimeFromStr (row[16]);
|
||||||
Str_Copy (Prj->ReviewTxt ,row[17],Cns_MAX_BYTES_TEXT);
|
Str_Copy (Prj->Review.Txt ,row[17],Cns_MAX_BYTES_TEXT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
/***** Free structure that stores the query result *****/
|
||||||
|
@ -3227,9 +3236,9 @@ static void Prj_ResetProject (struct Prj_Project *Prj)
|
||||||
Prj->Materials[0] = '\0';
|
Prj->Materials[0] = '\0';
|
||||||
Prj->URL[0] = '\0';
|
Prj->URL[0] = '\0';
|
||||||
|
|
||||||
Prj->ReviewStatus = Prj_REVIEW_STATUS_DEFAULT;
|
Prj->Review.Status = Prj_REVIEW_STATUS_DEFAULT;
|
||||||
Prj->ReviewTime = (time_t) 0;
|
Prj->Review.Time = (time_t) 0;
|
||||||
Prj->ReviewTxt[0] = '\0';
|
Prj->Review.Txt[0] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -3759,7 +3768,7 @@ void Prj_AllocMemProject (struct Prj_Project *Prj)
|
||||||
if ((Prj->Materials = malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL)
|
if ((Prj->Materials = malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL)
|
||||||
Err_NotEnoughMemoryExit ();
|
Err_NotEnoughMemoryExit ();
|
||||||
|
|
||||||
if ((Prj->ReviewTxt = malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL)
|
if ((Prj->Review.Txt = malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL)
|
||||||
Err_NotEnoughMemoryExit ();
|
Err_NotEnoughMemoryExit ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3784,10 +3793,10 @@ void Prj_FreeMemProject (struct Prj_Project *Prj)
|
||||||
free (Prj->Materials);
|
free (Prj->Materials);
|
||||||
Prj->Materials = NULL;
|
Prj->Materials = NULL;
|
||||||
}
|
}
|
||||||
if (Prj->ReviewTxt)
|
if (Prj->Review.Txt)
|
||||||
{
|
{
|
||||||
free (Prj->ReviewTxt);
|
free (Prj->Review.Txt);
|
||||||
Prj->ReviewTxt = NULL;
|
Prj->Review.Txt = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -173,9 +173,12 @@ struct Prj_Project
|
||||||
char *Knowledge;
|
char *Knowledge;
|
||||||
char *Materials;
|
char *Materials;
|
||||||
char URL[Cns_MAX_BYTES_WWW + 1];
|
char URL[Cns_MAX_BYTES_WWW + 1];
|
||||||
Prj_ReviewStatus_t ReviewStatus;
|
struct
|
||||||
time_t ReviewTime;
|
{
|
||||||
char *ReviewTxt;
|
Prj_ReviewStatus_t Status;
|
||||||
|
time_t Time;
|
||||||
|
char *Txt;
|
||||||
|
} Review;
|
||||||
};
|
};
|
||||||
|
|
||||||
/***** Struct to store context/status of projects *****/
|
/***** Struct to store context/status of projects *****/
|
||||||
|
|
|
@ -139,9 +139,9 @@ long Prj_DB_CreateProject (const struct Prj_Project *Prj)
|
||||||
Prj->Knowledge,
|
Prj->Knowledge,
|
||||||
Prj->Materials,
|
Prj->Materials,
|
||||||
Prj->URL,
|
Prj->URL,
|
||||||
Prj_ReviewStatus_DB[Prj->ReviewStatus],
|
Prj_ReviewStatus_DB[Prj->Review.Status],
|
||||||
Prj->ReviewTime,
|
Prj->Review.Time,
|
||||||
Prj->ReviewTxt);
|
Prj->Review.Txt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
Loading…
Reference in New Issue