mirror of https://github.com/acanas/swad-core.git
Version 18.14
This commit is contained in:
parent
b91b3c7624
commit
6e5b810527
|
@ -0,0 +1,294 @@
|
||||||
|
// swad_form.c: forms to go to actions
|
||||||
|
|
||||||
|
/*
|
||||||
|
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-2018 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 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 *********************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#include "swad_form.h"
|
||||||
|
#include "swad_global.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************** External global variables from others modules ****************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
extern struct Globals Gbl;
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************ Internal global variables **************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**************************** Private prototypes *****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void Frm_StartFormInternal (Act_Action_t NextAction,bool PutParameterLocationIfNoSesion,
|
||||||
|
const char *Id,const char *Anchor,const char *OnSubmit);
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************************** Start a form *******************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Frm_StartFormGoTo (Act_Action_t NextAction)
|
||||||
|
{
|
||||||
|
Gbl.Form.Num++; // Initialized to -1. The first time it is incremented, it will be equal to 0
|
||||||
|
snprintf (Gbl.Form.Id,sizeof (Gbl.Form.Id),
|
||||||
|
"form_%d",
|
||||||
|
Gbl.Form.Num);
|
||||||
|
Frm_StartFormInternal (NextAction,false,Gbl.Form.Id,NULL,NULL); // Do not put now parameter location
|
||||||
|
}
|
||||||
|
|
||||||
|
void Frm_StartForm (Act_Action_t NextAction)
|
||||||
|
{
|
||||||
|
Frm_StartFormAnchorOnSubmit (NextAction,NULL,NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Frm_StartFormAnchor (Act_Action_t NextAction,const char *Anchor)
|
||||||
|
{
|
||||||
|
Frm_StartFormAnchorOnSubmit (NextAction,Anchor,NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Frm_StartFormOnSubmit (Act_Action_t NextAction,const char *OnSubmit)
|
||||||
|
{
|
||||||
|
Frm_StartFormAnchorOnSubmit (NextAction,NULL,OnSubmit);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Frm_StartFormAnchorOnSubmit (Act_Action_t NextAction,const char *Anchor,const char *OnSubmit)
|
||||||
|
{
|
||||||
|
Gbl.Form.Num++; // Initialized to -1. The first time it is incremented, it will be equal to 0
|
||||||
|
snprintf (Gbl.Form.Id,sizeof (Gbl.Form.Id),
|
||||||
|
"form_%d",
|
||||||
|
Gbl.Form.Num);
|
||||||
|
Frm_StartFormInternal (NextAction,true,Gbl.Form.Id,Anchor,OnSubmit); // Do put now parameter location (if no open session)
|
||||||
|
}
|
||||||
|
|
||||||
|
void Frm_StartFormUnique (Act_Action_t NextAction)
|
||||||
|
{
|
||||||
|
Frm_StartFormUniqueAnchor (NextAction,NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Frm_StartFormUniqueAnchor (Act_Action_t NextAction,const char *Anchor)
|
||||||
|
{
|
||||||
|
Gbl.Form.Num++; // Initialized to -1. The first time it is incremented, it will be equal to 0
|
||||||
|
snprintf (Gbl.Form.UniqueId,sizeof (Gbl.Form.UniqueId),
|
||||||
|
"form_%s_%d",
|
||||||
|
Gbl.UniqueNameEncrypted,Gbl.Form.Num);
|
||||||
|
Frm_StartFormInternal (NextAction,true,Gbl.Form.UniqueId,Anchor,NULL); // Do put now parameter location (if no open session)
|
||||||
|
}
|
||||||
|
|
||||||
|
void Frm_StartFormId (Act_Action_t NextAction,const char *Id)
|
||||||
|
{
|
||||||
|
Gbl.Form.Num++; // Initialized to -1. The first time it is incremented, it will be equal to 0
|
||||||
|
Frm_StartFormInternal (NextAction,true,Id,NULL,NULL); // Do put now parameter location (if no open session)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Id can not be NULL
|
||||||
|
static void Frm_StartFormInternal (Act_Action_t NextAction,bool PutParameterLocationIfNoSesion,
|
||||||
|
const char *Id,const char *Anchor,const char *OnSubmit)
|
||||||
|
{
|
||||||
|
extern const char *Txt_STR_LANG_ID[1 + Txt_NUM_LANGUAGES];
|
||||||
|
char ParamsStr[Frm_MAX_BYTES_PARAMS_STR + 1];
|
||||||
|
|
||||||
|
if (!Gbl.Form.Inside)
|
||||||
|
{
|
||||||
|
/* Start form */
|
||||||
|
fprintf (Gbl.F.Out,"<form method=\"post\" action=\"%s/%s",
|
||||||
|
Cfg_URL_SWAD_CGI,
|
||||||
|
Txt_STR_LANG_ID[Gbl.Prefs.Language]);
|
||||||
|
if (Anchor)
|
||||||
|
if (Anchor[0])
|
||||||
|
fprintf (Gbl.F.Out,"#%s",Anchor);
|
||||||
|
fprintf (Gbl.F.Out,"\" id=\"%s\"",Id);
|
||||||
|
if (OnSubmit)
|
||||||
|
if (OnSubmit[0])
|
||||||
|
fprintf (Gbl.F.Out," onsubmit=\"%s;\"",OnSubmit);
|
||||||
|
switch (Act_GetBrowserTab (NextAction))
|
||||||
|
{
|
||||||
|
case Act_BRW_NEW_TAB:
|
||||||
|
case Act_DOWNLD_FILE:
|
||||||
|
fprintf (Gbl.F.Out," target=\"_blank\"");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (Act_GetContentType (NextAction) == Act_CONT_DATA)
|
||||||
|
fprintf (Gbl.F.Out," enctype=\"multipart/form-data\"");
|
||||||
|
fprintf (Gbl.F.Out," accept-charset=\"windows-1252\">");
|
||||||
|
|
||||||
|
/* Put basic form parameters */
|
||||||
|
Frm_SetParamsForm (ParamsStr,NextAction,PutParameterLocationIfNoSesion);
|
||||||
|
fprintf (Gbl.F.Out,"%s",ParamsStr);
|
||||||
|
|
||||||
|
Gbl.Form.Inside = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Frm_SetParamsForm (char ParamsStr[Frm_MAX_BYTES_PARAMS_STR + 1],Act_Action_t NextAction,
|
||||||
|
bool PutParameterLocationIfNoSesion)
|
||||||
|
{
|
||||||
|
char ParamAction[Frm_MAX_BYTES_PARAM_ACTION + 1];
|
||||||
|
char ParamSession[Frm_MAX_BYTES_PARAM_SESSION + 1];
|
||||||
|
char ParamLocation[Frm_MAX_BYTES_PARAM_LOCATION + 1];
|
||||||
|
|
||||||
|
ParamAction[0] = '\0';
|
||||||
|
ParamSession[0] = '\0';
|
||||||
|
ParamLocation[0] = '\0';
|
||||||
|
|
||||||
|
if (NextAction != ActUnk)
|
||||||
|
snprintf (ParamAction,sizeof (ParamAction),
|
||||||
|
"<input type=\"hidden\" name=\"act\" value=\"%ld\" />",
|
||||||
|
Act_GetActCod (NextAction));
|
||||||
|
|
||||||
|
if (Gbl.Session.Id[0])
|
||||||
|
snprintf (ParamSession,sizeof (ParamSession),
|
||||||
|
"<input type=\"hidden\" name=\"ses\" value=\"%s\" />",
|
||||||
|
Gbl.Session.Id);
|
||||||
|
else if (PutParameterLocationIfNoSesion)
|
||||||
|
// Extra parameters necessary when there's no open session
|
||||||
|
{
|
||||||
|
/* If session is open, course code will be get from session data,
|
||||||
|
but if there is not an open session, and next action is known,
|
||||||
|
it is necessary to send a parameter with course code */
|
||||||
|
if (Gbl.CurrentCrs.Crs.CrsCod > 0)
|
||||||
|
// If course selected...
|
||||||
|
snprintf (ParamLocation,sizeof (ParamLocation),
|
||||||
|
"<input type=\"hidden\" name=\"crs\" value=\"%ld\" />",
|
||||||
|
Gbl.CurrentCrs.Crs.CrsCod);
|
||||||
|
else if (Gbl.CurrentDeg.Deg.DegCod > 0)
|
||||||
|
// If no course selected, but degree selected...
|
||||||
|
snprintf (ParamLocation,sizeof (ParamLocation),
|
||||||
|
"<input type=\"hidden\" name=\"deg\" value=\"%ld\" />",
|
||||||
|
Gbl.CurrentDeg.Deg.DegCod);
|
||||||
|
else if (Gbl.CurrentCtr.Ctr.CtrCod > 0)
|
||||||
|
// If no degree selected, but centre selected...
|
||||||
|
snprintf (ParamLocation,sizeof (ParamLocation),
|
||||||
|
"<input type=\"hidden\" name=\"ctr\" value=\"%ld\" />",
|
||||||
|
Gbl.CurrentCtr.Ctr.CtrCod);
|
||||||
|
else if (Gbl.CurrentIns.Ins.InsCod > 0)
|
||||||
|
// If no centre selected, but institution selected...
|
||||||
|
snprintf (ParamLocation,sizeof (ParamLocation),
|
||||||
|
"<input type=\"hidden\" name=\"ins\" value=\"%ld\" />",
|
||||||
|
Gbl.CurrentIns.Ins.InsCod);
|
||||||
|
else if (Gbl.CurrentCty.Cty.CtyCod > 0)
|
||||||
|
// If no institution selected, but country selected...
|
||||||
|
snprintf (ParamLocation,sizeof (ParamLocation),
|
||||||
|
"<input type=\"hidden\" name=\"cty\" value=\"%ld\" />",
|
||||||
|
Gbl.CurrentCty.Cty.CtyCod);
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf (ParamsStr,Frm_MAX_BYTES_PARAMS_STR + 1,
|
||||||
|
"%s%s%s",
|
||||||
|
ParamAction,ParamSession,ParamLocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Frm_EndForm (void)
|
||||||
|
{
|
||||||
|
if (Gbl.Form.Inside)
|
||||||
|
{
|
||||||
|
fprintf (Gbl.F.Out,"</form>");
|
||||||
|
Gbl.Form.Inside = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************* Anchor directive used to send a form ********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
// Requires an extern </a>
|
||||||
|
|
||||||
|
void Frm_LinkFormSubmit (const char *Title,const char *LinkStyle,
|
||||||
|
const char *OnSubmit)
|
||||||
|
{
|
||||||
|
Frm_LinkFormSubmitId (Title,LinkStyle,Gbl.Form.Id,OnSubmit);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Frm_LinkFormSubmitUnique (const char *Title,const char *LinkStyle)
|
||||||
|
{
|
||||||
|
Frm_LinkFormSubmitId (Title,LinkStyle,Gbl.Form.UniqueId,NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Title can be NULL
|
||||||
|
// LinkStyle can be NULL
|
||||||
|
// Id can not be NULL
|
||||||
|
// OnSubmit can be NULL
|
||||||
|
|
||||||
|
void Frm_LinkFormSubmitId (const char *Title,const char *LinkStyle,
|
||||||
|
const char *Id,const char *OnSubmit)
|
||||||
|
{
|
||||||
|
fprintf (Gbl.F.Out,"<a href=\"\"");
|
||||||
|
if (Title)
|
||||||
|
if (Title[0])
|
||||||
|
fprintf (Gbl.F.Out," title=\"%s\"",Title);
|
||||||
|
if (LinkStyle)
|
||||||
|
if (LinkStyle[0])
|
||||||
|
fprintf (Gbl.F.Out," class=\"%s\"",LinkStyle);
|
||||||
|
fprintf (Gbl.F.Out," onclick=\"");
|
||||||
|
if (OnSubmit) // JavaScript function to be called
|
||||||
|
// before submitting the form
|
||||||
|
if (OnSubmit[0])
|
||||||
|
fprintf (Gbl.F.Out,"%s;",OnSubmit);
|
||||||
|
fprintf (Gbl.F.Out,"document.getElementById('%s').submit();"
|
||||||
|
"return false;\">",
|
||||||
|
Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Frm_LinkFormSubmitAnimated (const char *Title,const char *LinkStyle,
|
||||||
|
const char *OnSubmit)
|
||||||
|
{
|
||||||
|
fprintf (Gbl.F.Out,"<a href=\"\"");
|
||||||
|
if (Title)
|
||||||
|
if (Title[0])
|
||||||
|
fprintf (Gbl.F.Out," title=\"%s\"",Title);
|
||||||
|
if (LinkStyle)
|
||||||
|
if (LinkStyle[0])
|
||||||
|
fprintf (Gbl.F.Out," class=\"%s\"",LinkStyle);
|
||||||
|
fprintf (Gbl.F.Out," onclick=\"");
|
||||||
|
if (OnSubmit) // JavaScript function to be called
|
||||||
|
// before submitting the form
|
||||||
|
if (OnSubmit[0])
|
||||||
|
fprintf (Gbl.F.Out,"%s;",OnSubmit);
|
||||||
|
fprintf (Gbl.F.Out,"AnimateIcon(%d);"
|
||||||
|
"document.getElementById('%s').submit();"
|
||||||
|
"return false;\">",
|
||||||
|
Gbl.Form.Num,
|
||||||
|
Gbl.Form.Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/***************************** Get unique Id *********************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Frm_SetUniqueId (char UniqueId[Frm_MAX_BYTES_ID + 1])
|
||||||
|
{
|
||||||
|
static unsigned CountForThisExecution = 0;
|
||||||
|
|
||||||
|
/***** Create Id. The id must be unique,
|
||||||
|
the page content may be updated via AJAX.
|
||||||
|
So, Id uses:
|
||||||
|
- a name for this execution (Gbl.UniqueNameEncrypted)
|
||||||
|
- a number for each element in this execution (CountForThisExecution) *****/
|
||||||
|
snprintf (UniqueId,Frm_MAX_BYTES_ID + 1,
|
||||||
|
"id_%s_%u",
|
||||||
|
Gbl.UniqueNameEncrypted,
|
||||||
|
++CountForThisExecution);
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
// swad_form.h: forms to go to actions
|
||||||
|
|
||||||
|
#ifndef _SWAD_FRM
|
||||||
|
#define _SWAD_FRM
|
||||||
|
/*
|
||||||
|
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-2018 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 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 **********************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#include "swad_action.h"
|
||||||
|
#include "swad_constant.h"
|
||||||
|
#include "swad_cryptography.h"
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/****************************** Public constants *****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#define Frm_MAX_BYTES_ID (32 + Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 10)
|
||||||
|
|
||||||
|
#define Frm_MAX_BYTES_PARAM_ACTION 256
|
||||||
|
#define Frm_MAX_BYTES_PARAM_SESSION (256 + Cns_BYTES_SESSION_ID)
|
||||||
|
#define Frm_MAX_BYTES_PARAM_LOCATION 256
|
||||||
|
#define Frm_MAX_BYTES_PARAMS_STR (Frm_MAX_BYTES_PARAM_ACTION + Frm_MAX_BYTES_PARAM_SESSION + Frm_MAX_BYTES_PARAM_LOCATION)
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************************** Public types *******************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/***************************** Public prototypes *****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Frm_StartFormGoTo (Act_Action_t NextAction);
|
||||||
|
void Frm_StartForm (Act_Action_t NextAction);
|
||||||
|
void Frm_StartFormOnSubmit (Act_Action_t NextAction,const char *OnSubmit);
|
||||||
|
void Frm_StartFormAnchorOnSubmit (Act_Action_t NextAction,const char *Anchor,const char *OnSubmit);
|
||||||
|
void Frm_StartFormUnique (Act_Action_t NextAction);
|
||||||
|
void Frm_StartFormAnchor (Act_Action_t NextAction,const char *Anchor);
|
||||||
|
void Frm_StartFormUniqueAnchor (Act_Action_t NextAction,const char *Anchor);
|
||||||
|
void Frm_StartFormId (Act_Action_t NextAction,const char *Id);
|
||||||
|
void Frm_SetParamsForm (char ParamsStr[Frm_MAX_BYTES_PARAMS_STR],Act_Action_t NextAction,
|
||||||
|
bool PutParameterLocationIfNoSesion);
|
||||||
|
void Frm_EndForm (void);
|
||||||
|
void Frm_LinkFormSubmit (const char *Title,const char *LinkStyle,
|
||||||
|
const char *OnSubmit);
|
||||||
|
void Frm_LinkFormSubmitUnique (const char *Title,const char *LinkStyle);
|
||||||
|
void Frm_LinkFormSubmitId (const char *Title,const char *LinkStyle,
|
||||||
|
const char *Id,const char *OnSubmit);
|
||||||
|
void Frm_LinkFormSubmitAnimated (const char *Title,const char *LinkStyle,
|
||||||
|
const char *OnSubmit);
|
||||||
|
|
||||||
|
void Frm_SetUniqueId (char UniqueId[Frm_MAX_BYTES_ID + 1]);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue