Fonctions utiles pour l'écriture de code Javascript
Voici un résumé des fonctions javascript facilement utilisables par un administrateur. Il s'agit bien entendu des principales fonctions, les plus simples en utilisation, avec quelques déclinaisons. Cette liste n'est pas exhaustive.
-
APSGetFieldByName( fieldName )retourne le champs HTML (pour s'abonner aux événements onclick, onchange par exemple) -
APSGetFieldValueByName( fieldName )retourne la valeur contenue dans un champ -
APSGetDocumentFieldValueByName( fieldName )Va chercher la valeur d'un champ du document courant dans la base de donnée Utile si le champ n'est pas sur la page en cours (si le champ est présent à l'écran cela peut renvoyer une valeur différente de celle en cours de saisie) -
APSSetFieldValueByName( fieldName, vals )Positionne la valeur d'un champ sur la page en ui. NB : si le champ n'est pas modifiable, la valeur ne sera pas insérée en base de donnée -
APSGetFieldAllValuesByName( fieldName)Récupère le contenu d'un champ multivalué dans un tableau -
APSFormatNumber( number, ndec, decimalseparator )Mise en forme d'un nombre (retourne une string formatée) Exemple : APSSetFieldValueByName( APSFormatNumber( APSGetFieldValueByName( "nom_champ" ), 2, " " ) );
Il existe d'autres fonctions permettant de manipuler le document courant, via un objet CurrentDocument toujours présent sur la page :
CurrentDocument.GetStringValue( fieldName )idem APSGetFieldValueByNameCurrentDocument.SetValue( fieldName, value )idem APSSetFieldValueByNameCurrentDocument.SetBackendValue( fieldName, value )Positionne la valeur d'un champ NON PRESENT SUR LA PAGE soir directement dans la base de donnéeCurrentDocument.GetBackendValue( fieldName )Idem APSGetDocumentFieldValueByNameCurrentDocument.BuildReference()Force un recalcul la référence du document (attention, le document doit avoir été enregistré au moins 1 fois)
Mettre à jour ou lire les champs d'un autre document que le document courant, en 2 temps
-
Créer un objet javascript avec l'id du doc en question
var unAutreDoc = new DocumentDocHelper( id_du_document_en_question ); -
Manipuler ce document (seul 2 fonctions sont utilisables)
unAutreDoc.GetBackendValue( fieldName )unAutreDoc.SetBackendValue( fieldName, value )
1. Affichage du cn_name d'un utilisateur dont le nom est renseigné dans un champ et pour lequel la case 'contient une ressource de l'annuaire' est cochée' :
Utiliser la fonction javascript suivante :
function getCnName(dnName)
{
var handlerUrl = BaseSite + "PStudioActions.ashx";
handlerUrl += "?action=GetDirectoryResourceInfos";
handlerUrl += "&ids=" + encodeURIComponent(dnName);
var arr = APSAjaxGETRequest(handlerUrl);
var json = JSON.parse(arr);
for (item in json)
{
if (json[item] != null)
return json[item].displayName;
}
return "CN_name non trouvé pour '" + dnName + "'.";
}
2. [2016] Affichage d'une picklist de sélection de ressources en fonction du rôle du rédacteur
Ajouter le code suivant dans les paramètres personalisés (javascript) du champ :
console.log('debug debut');
var handlerUrl = BaseSite + "Custom_GEODE/Contratheque/ContrathequeHandler.ashx";
handlerUrl += "?query=GetAuthorRole";
var res = APSAjaxGETRequest(handlerUrl);
console.log('debug return :' + res);
if (res == 'Oui')
OpenDirectoryPicker({0}, 'user' , true);
else
//lecture seule
console.log('debug lecture seule');
console.log('debug fin');
Et implémenter un handler avec le code suivant :
using Avanteam.Application.Security;
...
/// <summary>
/// Récupération du rôle de l'auteur
/// </summary>
/// <returns></returns>
private string GetAuthorRole()
{
APSUser currentUser = APSUser.GetUserFromSession();
List<string> userRoles = currentUser.Roles;
if (userRoles.Contains("CT-Responsable Juridique") || userRoles.Contains("Admin"))
{
return "Oui";
}
else return "Non";
}
3. Actualisation d'une page
3.1. Côté client
Ajouter le code suivant dans un composant pour disposer d'un bouton d'actualisation de la page du formulaire associé :
<input onclick="window.location.reload(); return false;" type="button" value="Actualiser" />
3.2. Côté serveur
Assurez-vous qu'un objet de type ApsPageManager est déclaré :
private ApsPageManager _page = null;
public ApsPageManager APSPage
{
get
{
if (_page == null)
_page = Page as ApsPageManager;
return _page;
}
}
Ajouter le code suivant en fin de traitement :
APSPage.Response.Redirect(APSPage.Request.Url.ToString(), true);
4. Récupération côté client de champs multivalués
Rationale : en v2016SP1, je n'ai pas trouvé de fonctions javascript de récupération de champs multivalués.
Solution de contournement :
Javascript :
// 1.5 traitement des champs multivalués
var handlerUrl = BaseSite + "Custom_GEODE/Contratheque/ContrathequeHandler.ashx";
handlerUrl += "?query=getMultiValue";
handlerUrl += "&Field=" + "Relecteurs";
handlerUrl += "&idContratlie=" + idContratlie;
var res = APSAjaxGETRequest(handlerUrl);
if (res == "")
console.log("Une erreur est survenue dans la duplication d'un champ multi-valué 'Relecteurs' du contrat principal dans l'avenant : " + res);
else {
console.log('relecteurs : ' + res);
APSSetFieldValueByName('Relecteurs', res.split(';'));
}
Handler :
/// <summary>
/// Récupération des champs multivalués
/// </summary>
/// <returns></returns>
private string getMultiValue(string field, string idContratlie)
{
// 1.5 traitement des champs multivalués
string @query = string.Format(@"select value
from FRM_Contrat_FLD_{0}
where id_document = @idContratlie", field);
DataTable res = DocumentsDataSource.SQL_ExecuteSelect(query, new KeyPair("idContratlie", idContratlie));
List<string> liste = new List<string>();
if (res.Rows.Count > 0)
{
foreach (DataRow row in res.Rows)
{
liste.Add((string)row["value"]);
}
}
return string.Join(";", liste.ToArray());
}
5. Fonction de vérification d'un champ date
Associer le paramètre avancé sur le champ à vérifier 'CustomValidationFunction' à la fonction checkDate(). Renseigner le paramètre avancé 'CustomValidationErrorText' avec un message d'erreur.
Ajouter la fonction suivante au composant du formulaire :
// fonction de vérification de la date courante
function checkDate(oSrc, args)
{
//console.log("debug checkDate : " + args.Value);
var dateString = args.Value;
var dateTab = dateString.split('/');
var date = new Date(dateTab[2], dateTab[1] - 1, dateTab[0]);
//console.log("debug checkDate js : " + date);
var today = new Date();
today.setHours(0, 0, 0, 0);
if (date < today)
{
args.IsValid = false;
}
else
{
args.IsValid = true;
}
}
6. Comparaison de dates
Ce code permet de comparer 2 dates, au moment de la saisie d'un champ Date sur le quel le contrôle doit être fait.
Ici, la date de réception de la réponse (FAIDateReceptionReponse) ne doit pas être antérieure à la date de la réponse (FAIDateReponse).
Dans les propriétés avancées du champ Date sur lequel le contrôle doit être fait, ajouter les options javacript & javascript:oninit comme indiqué ci dessous :

Code à insérer dans javascript :
function OnDateEventChange2()
{
var fDateReponse = CurrentDocument.GetBackendValue("FAIDateReponse");
var fDateReceptionReponse = APSGetFieldByName("FAIDateReceptionReponse");
if (fDateReceptionReponse.value.length < 10)
return;
var d2 = getDate(fDateReponse);
var d1 = getDate(fDateReceptionReponse.value);
if (compare(d1, d2) < 0)
{
alert("La date de réception de réponse ne peut pas être antérieure à la date de la réponse !");
fDateReceptionReponse.value = "";
}
}
//On suppose que la date entrée a été validée auparavant
//au format dd/mm/yyyy
function getDate(strDate)
{
day = strDate.substring(0, 2);
month = strDate.substring(3, 5);
year = strDate.substring(6, 10);
d = new Date();
d.setDate(day);
d.setMonth(month - 1);
d.setFullYear(year);
return d;
}
//Retourne:
// 0 si date_1=date_2
// 1 si date_1>date_2
// -1 si date_1<date_2
function compare(date_1, date_2)
{
diff = date_1.getTime() - date_2.getTime();
return (diff == 0 ? diff : diff / Math.abs(diff));
}
Dans ce code, il faut bien entendu adapter le nom des champs à comparer (ici FAIDateReceptionReponse et FAIDateReponse).
Code à insérer dans le Javacript:onInit :
APSAttachEventToElement( APSGetFieldByName("FAIDateReceptionReponse") , "change", OnDateEventChange2 );
Dans ce code, il faut mentionner le nom du champ courant (ici FAIDateReceptionReponse) pour que le contrôle se fasse au moment de la saisie sur ce champ.
7. Vidage d'un champ contenant plusieurs ressources de l'annuaire (v2016)
Pour un champ de multivalué contenant des ressources de l'annuaire piloté par un autre champ de type radio-bouton (Oui/Non) :
//Fonction pour masquer les experts
using System.Reflection.Metadata;
using System;
function MasqueExperts()
{
var val = APSGetFieldValueByName("PrevenirExperts");
var cel = document.getElementById("tdExperts");
if (val == "Oui")
{
cel.style.display = "block";
}
else
{
// hack pour contourner le bug de APSSetFieldValueByName qui ne fonctionne pas avec les champs multivalués ressource de l'annuaire
console.log("clearing experts");
if (APSGetFieldByName("Experts"))
{
APSGetFieldByName("Experts").innerHTML = '';
APSGetFieldByName("Experts").value = '';
if (APSGetFieldByName("Experts").parentElement.querySelector('.apsFieldInputEdit'))
{
APSGetFieldByName("Experts").parentElement.querySelector('.apsFieldInputEdit').innerHTML = '';
cel.style.display = "none";
}
}
console.log("clearing experts done");
}
}
APSAttachEventToElement(window, "load", MasqueExperts);
8. Changement dynamique d'un label
var label = APSGetFieldByName("NomChamp").parentElement.parentElement.querySelector('label span'); if (!label.innerHTML.endsWith('*')) label.innerHTML += ' *';