swad-core/swad_hierarchy_config.c

361 lines
12 KiB
C
Raw Permalink Normal View History

// swad_hierarchy_config.c: hierarchy (country, institution, center, degree, course) configuration
2019-12-29 20:11:57 +01:00
/*
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-2024 Antonio Ca<EFBFBD>as Vargas
2019-12-29 20:11:57 +01:00
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public 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 <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
#define _GNU_SOURCE // For asprintf
#include <stdio.h> // For asprintf
#include <stdlib.h> // For free
#include "swad_action_list.h"
#include "swad_error.h"
2020-05-02 10:53:40 +02:00
#include "swad_figure_cache.h"
2019-12-29 20:11:57 +01:00
#include "swad_form.h"
#include "swad_global.h"
#include "swad_hierarchy_config.h"
2019-12-29 20:11:57 +01:00
#include "swad_HTML.h"
#include "swad_logo.h"
#include "swad_QR.h"
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
extern struct Globals Gbl;
/*****************************************************************************/
/************************ Show title in configuration ************************/
/*****************************************************************************/
void HieCfg_Title (Hie_PutLink_t PutLink,Hie_Level_t Level)
2019-12-29 20:11:57 +01:00
{
Hie_Level_t LevelLogo = (Level == Hie_CRS) ? Hie_DEG :
Level;
/***** Begin container *****/
HTM_DIV_Begin ("class=\"FRAME_TITLE FRAME_TITLE_BIG FRAME_TITLE_%s\"",
The_GetSuffix ());
/* Begin link */
if (PutLink == Hie_PUT_LINK)
HTM_A_Begin ("href=\"%s\" target=\"_blank\" title=\"%s\""
" class=\"FRAME_TITLE_BIG FRAME_TITLE_%s\"",
Gbl.Hierarchy.Node[LevelLogo].WWW,
Gbl.Hierarchy.Node[LevelLogo].FullName,
The_GetSuffix ());
/* Logo and name */
Lgo_DrawLogo (LevelLogo,&Gbl.Hierarchy.Node[LevelLogo],"ICO64x64");
HTM_BR ();
HTM_Txt (Gbl.Hierarchy.Node[Level].FullName);
/* End link */
if (PutLink == Hie_PUT_LINK)
HTM_A_End ();
/***** End container *****/
2019-12-29 20:11:57 +01:00
HTM_DIV_End ();
}
/*****************************************************************************/
/******************* Show short/full name in configuration *******************/
2019-12-29 20:11:57 +01:00
/*****************************************************************************/
void HieCfg_Name (Frm_PutForm_t PutForm,Hie_Level_t Level,
Nam_ShrtOrFullName_t ShrtOrFull)
2019-12-29 20:11:57 +01:00
{
extern const char *Nam_Params[Nam_NUM_SHRT_FULL_NAMES];
extern unsigned Nam_MaxChars[Nam_NUM_SHRT_FULL_NAMES];
extern const char *Nam_Classes[Nam_NUM_SHRT_FULL_NAMES];
extern const char *Txt_Short_name;
extern const char *Txt_HIERARCHY_SINGUL_Abc[Hie_NUM_LEVELS];
static Act_Action_t Action[Hie_NUM_LEVELS][Nam_NUM_SHRT_FULL_NAMES] =
{
[Hie_INS][Nam_SHRT_NAME] = ActRenInsShoCfg,
[Hie_INS][Nam_FULL_NAME] = ActRenInsFulCfg,
[Hie_CTR][Nam_SHRT_NAME] = ActRenCtrShoCfg,
[Hie_CTR][Nam_FULL_NAME] = ActRenCtrFulCfg,
[Hie_DEG][Nam_SHRT_NAME] = ActRenDegShoCfg,
[Hie_DEG][Nam_FULL_NAME] = ActRenDegFulCfg,
[Hie_CRS][Nam_SHRT_NAME] = ActRenCrsShoCfg,
[Hie_CRS][Nam_FULL_NAME] = ActRenCrsFulCfg,
};
const char *Id[Frm_NUM_PUT_FORM] =
{
[Frm_DONT_PUT_FORM] = NULL,
[Frm_PUT_FORM ] = Nam_Params[ShrtOrFull],
};
const char *Name[Nam_NUM_SHRT_FULL_NAMES] =
{
[Nam_SHRT_NAME] = Gbl.Hierarchy.Node[Level].ShrtName,
[Nam_FULL_NAME] = Gbl.Hierarchy.Node[Level].FullName,
};
2019-12-29 20:11:57 +01:00
/***** Full name *****/
HTM_TR_Begin (NULL);
/* Label */
Frm_LabelColumn ("Frm_C1 RT",Id[PutForm],
ShrtOrFull == Nam_SHRT_NAME ? Txt_Short_name :
Txt_HIERARCHY_SINGUL_Abc[Level]);
/* Data */
HTM_TD_Begin ("class=\"Frm_C2 LB DAT_STRONG_%s\"",The_GetSuffix ());
switch (PutForm)
{
case Frm_DONT_PUT_FORM: // I can not edit full name
HTM_Txt (Name[ShrtOrFull]);
break;
case Frm_PUT_FORM:
/* Form to change full name */
Frm_BeginForm (Action[Level][ShrtOrFull]);
HTM_INPUT_TEXT (Nam_Params[ShrtOrFull],
Nam_MaxChars[ShrtOrFull],
Name[ShrtOrFull],
HTM_SUBMIT_ON_CHANGE,
"id=\"%s\""
" class=\"%s INPUT_%s\""
" required=\"required\"",
Nam_Params[ShrtOrFull],
Nam_Classes[ShrtOrFull],
The_GetSuffix ());
Frm_EndForm ();
break;
}
HTM_TD_End ();
2019-12-29 20:11:57 +01:00
HTM_TR_End ();
}
/*****************************************************************************/
/************************* Show web in configuration *************************/
/*****************************************************************************/
void HieCfg_WWW (Vie_ViewType_t ViewType,Frm_PutForm_t PutForm,
Act_Action_t NextAction,const char WWW[Cns_MAX_BYTES_WWW + 1])
2019-12-29 20:11:57 +01:00
{
extern const char *Txt_Web;
static const char *Id[Frm_NUM_PUT_FORM] =
{
[Frm_DONT_PUT_FORM] = NULL,
[Frm_PUT_FORM ] = "WWW",
};
2019-12-29 20:11:57 +01:00
/***** Web *****/
HTM_TR_Begin (NULL);
/* Label */
Frm_LabelColumn ("Frm_C1 RT",Id[PutForm],Txt_Web);
/* Data */
HTM_TD_Begin ("class=\"Frm_C2 LB DAT_%s\"",The_GetSuffix ());
switch (PutForm)
{
case Frm_DONT_PUT_FORM: // I can not change web
HTM_DIV_Begin ("class=\"EXTERNAL_WWW_FULL\"");
if (ViewType == Vie_VIEW)
HTM_A_Begin ("href=\"%s\" target=\"_blank\""
" class=\"DAT_%s\"",
WWW,The_GetSuffix ());
HTM_Txt (WWW);
if (ViewType == Vie_VIEW)
HTM_A_End ();
HTM_DIV_End ();
break;
case Frm_PUT_FORM:
/* Form to change web */
Frm_BeginForm (NextAction);
HTM_INPUT_URL ("WWW",WWW,HTM_SUBMIT_ON_CHANGE,
"id=\"WWW\" class=\"Frm_C2_INPUT INPUT_%s\""
" required=\"required\"",
The_GetSuffix ());
Frm_EndForm ();
break;
}
HTM_TD_End ();
2019-12-29 20:11:57 +01:00
HTM_TR_End ();
}
/*****************************************************************************/
/********************** Show shortcut in configuration ***********************/
/*****************************************************************************/
void HieCfg_Shortcut (Vie_ViewType_t ViewType,ParCod_Param_t ParCode,long HieCod)
2019-12-29 20:11:57 +01:00
{
extern const char *Par_CodeStr[Par_NUM_PAR_COD];
2019-12-29 20:11:57 +01:00
extern const char *Txt_Shortcut;
/***** Short cut *****/
HTM_TR_Begin (NULL);
/* Label */
Frm_LabelColumn ("Frm_C1 RT",NULL,Txt_Shortcut);
/* Data */
HTM_TD_Begin ("class=\"Frm_C2 LB DAT_%s\"",The_GetSuffix ());
if (ViewType == Vie_VIEW)
{
if (ParCode == ParCod_None)
HTM_A_Begin ("href=\"%s/\" target=\"_blank\" class=\"DAT_%s\"",
Cfg_URL_SWAD_CGI,
The_GetSuffix ());
else
HTM_A_Begin ("href=\"%s/?%s=%ld\" target=\"_blank\""
" class=\"DAT_%s\"",
Cfg_URL_SWAD_CGI,
Par_CodeStr[ParCode],HieCod,
The_GetSuffix ());
}
if (ParCode == ParCod_None)
HTM_TxtF ("%s/",
2020-01-09 16:44:14 +01:00
Cfg_URL_SWAD_CGI);
else
HTM_TxtF ("%s/?%s=%ld",
Cfg_URL_SWAD_CGI,
Par_CodeStr[ParCode],HieCod);
if (ViewType == Vie_VIEW)
HTM_A_End ();
HTM_TD_End ();
2019-12-29 20:11:57 +01:00
HTM_TR_End ();
}
2020-01-25 22:18:01 +01:00
/*****************************************************************************/
/************************** Show number of centers ***************************/
2020-01-25 22:18:01 +01:00
/*****************************************************************************/
void HieCfg_NumCtrs (unsigned NumCtrs,Frm_PutForm_t PutForm)
2020-01-25 22:18:01 +01:00
{
extern const char *Txt_HIERARCHY_PLURAL_Abc[Hie_NUM_LEVELS];
extern const char *Txt_Centers_of_INSTITUTION_X;
char *Title;
2020-01-25 22:18:01 +01:00
/***** Number of centers *****/
2020-01-25 22:18:01 +01:00
HTM_TR_Begin (NULL);
/* Label */
Frm_LabelColumn ("Frm_C1 RT",NULL,Txt_HIERARCHY_PLURAL_Abc[Hie_CTR]);
/* Data */
HTM_TD_Begin ("class=\"Frm_C2 LB DAT_%s\"",The_GetSuffix ());
if (PutForm == Frm_PUT_FORM)
{
Frm_BeginFormGoTo (ActSeeCtr);
ParCod_PutPar (ParCod_Ins,Gbl.Hierarchy.Node[Hie_INS].HieCod);
if (asprintf (&Title,Txt_Centers_of_INSTITUTION_X,
Gbl.Hierarchy.Node[Hie_INS].ShrtName) < 0)
Err_NotEnoughMemoryExit ();
HTM_BUTTON_Submit_Begin (Title,"class=\"LB BT_LINK\"");
free (Title);
}
HTM_Unsigned (NumCtrs);
if (PutForm == Frm_PUT_FORM)
{
HTM_BUTTON_End ();
Frm_EndForm ();
}
HTM_TD_End ();
2020-01-25 22:18:01 +01:00
HTM_TR_End ();
}
/*****************************************************************************/
/********************* Show number of centers with map ***********************/
2020-01-25 22:18:01 +01:00
/*****************************************************************************/
void HieCfg_NumCtrsWithMap (unsigned NumCtrs,unsigned NumCtrsWithMap)
{
extern const char *Txt_Centers_with_map;
2020-01-25 22:18:01 +01:00
/***** Number of centers with map *****/
2020-01-25 22:18:01 +01:00
HTM_TR_Begin (NULL);
/* Label */
Frm_LabelColumn ("Frm_C1 RT",NULL,Txt_Centers_with_map);
2020-01-25 22:18:01 +01:00
/* Data */
HTM_TD_Begin ("class=\"Frm_C2 LB DAT_%s\"",The_GetSuffix ());
HTM_TxtF ("%u (%.1lf%%)",
NumCtrsWithMap,
NumCtrs ? (double) NumCtrsWithMap * 100.0 /
(double) NumCtrs :
0.0);
HTM_TD_End ();
2020-01-25 22:18:01 +01:00
HTM_TR_End ();
}
2019-12-29 20:11:57 +01:00
/*****************************************************************************/
/************************* Show QR in configuration **************************/
/*****************************************************************************/
void HieCfg_QR (ParCod_Param_t ParCode,long HieCod)
2019-12-29 20:11:57 +01:00
{
extern const char *Txt_QR_code;
/***** QR *****/
HTM_TR_Begin (NULL);
/* Label */
Frm_LabelColumn ("RT",NULL,Txt_QR_code);
2019-12-29 20:11:57 +01:00
/* Data */
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
QR_LinkTo (250,ParCode,HieCod);
HTM_TD_End ();
2019-12-29 20:11:57 +01:00
HTM_TR_End ();
}
2020-05-02 10:53:40 +02:00
/*****************************************************************************/
/************************ Number of users in courses *************************/
/*****************************************************************************/
void HieCfg_NumUsrsInCrss (Hie_Level_t Level,long Cod,Rol_Role_t Role)
2020-05-02 10:53:40 +02:00
{
extern const char *Txt_Users_in_courses;
extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
/***** Number of users in courses *****/
HTM_TR_Begin (NULL);
/* Label */
Frm_LabelColumn ("Frm_C1 RT",NULL,
Role == Rol_UNK ? Txt_Users_in_courses :
Txt_ROLES_PLURAL_Abc[Role][Usr_SEX_UNKNOWN]);
/* Data */
HTM_TD_Begin ("class=\"Frm_C2 LB DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Enr_GetCachedNumUsrsInCrss (Level,Cod,
Role == Rol_UNK ? (1 << Rol_STD) |
(1 << Rol_NET) |
(1 << Rol_TCH) : // Any user
(1 << Role)));
HTM_TD_End ();
2020-05-02 10:53:40 +02:00
HTM_TR_End ();
}