Validation et affichage d'un Field Type téléphone

Bonjour,

Je voudrais ajouter une validation à un champ de type téléphone et aussi l’afficher avec espace :

Exemple :
2020-03-04 11_20_19-Conjonction®
Voici le code que j’ai mis dans le postValidate de l’objet (Attention : dans l’exemple en ligne, il est mis getFieldValue au lieu de getField) :

	var f = this.getField("natPersonPhone2");
	f.setValue("natPersonPhone2", new PhoneNumTool("fr").getNationalNumber(f.getValue()));

Voici l’erreur que j’obtiens :

020-03-04 11:18:14,713 ERROR [com.simplicite.util.RhinoScriptInterpreter] SIMPLICITE|http://e3m.simplicite.io:10118||ECORESC002|designer|com.simplicite.util.RhinoScriptInterpreter|ImmoNaturalPerson.preValidate||Erreur évaluation script: ImmoNaturalPerson
    org.mozilla.javascript.EvaluatorException: Cannot convert 02 23 45 67 89 to java.lang.Integer (ImmoNaturalPerson#75) in ImmoNaturalPerson at line number 75

Aurais-je oublié qq choses ?

Notre instance :


Merci d’avance pour votre aide.
Abed.

Les tests unitaires de PhoneNumTool en P24 marchent:

String[] n = new String[] { "0144556677", "01 44 55 66 77", "+33 1 44 55 66 77", "00 33 1 44 55 66 77", "+44 1 483 536 888" };
PhoneNumTool pt = new PhoneNumTool("fr");
for (int i = 0; i < n.length; i++) {
	debug(n[i] + ", valid ? = " + pt.isValid(n[i]) + " = " + pt.getNumber(n[i]) + " = " + pt.getInternationalNumber(n[i]) + " = " + pt.getNationalNumber(n[i]) + " = " + pt.getURL(n[i]));
}

Résultat:

0144556677, valid ? = true = +33144556677 = +33 1 44 55 66 77 = 01 44 55 66 77 = tel:+33-1-44-55-66-77
01 44 55 66 77, valid ? = true = +33144556677 = +33 1 44 55 66 77 = 01 44 55 66 77 = tel:+33-1-44-55-66-77
+33 1 44 55 66 77, valid ? = true = +33144556677 = +33 1 44 55 66 77 = 01 44 55 66 77 = tel:+33-1-44-55-66-77
00 33 1 44 55 66 77, valid ? = true = +33144556677 = +33 1 44 55 66 77 = 01 44 55 66 77 = tel:+33-1-44-55-66-77
+44 1 483 536 888, valid ? = true = +441483536888 = +44 1483 536888 = 01483 536888 = tel:+44-1483-536888

Visiblement Rhino ne comprend pas que c’est un string et invoque la méthode setValue(int) au lieu de setValue(string)

essayez de forcer le string avec :

var num = "" + (new PhoneNumTool("fr").getNationalNumber(f.getValue()));
f.setValue(num);

ou un toString()

En java, on n’a jamais ce problème de cast.
On a les mêmes problèmes avec Tool.isEmpty() en rhino.

C’est étrange car PhoneNumTool.getNationalNumber(String) renvoie bien un String il ne devrait donc pas avoir d’ambiguïté niveau Rhino pour le choix de la méthode setField(String)

Le compilo Rhino ne comprend pas bien le type d’un “new x().y()” dans un argument de méthode.
il faut le mettre dans une variable en 2 étapes.

J’ai testé avec un objet scripté en Rhino et je n’ai pas de pb avec ce code sur un attribut de type “phone number”:

MyObject.preValidate = function() {
	var f = this.getField("myPhone");
	f.setValue(new PhoneNumTool("fr").getNationalNumber(f.getValue()));
};

Le pb doit donc être ailleurs…

Merci @david et @Francois.
Je confirme que le contournement proposé par @Francois règle le pb pour ma part.

J’en profite juste pour poser une autre question :
Serait-il possible d’utiliser cette même fonctionnalité (validation + ajout espace) dans javascript ? Je voudrais l’appliquer aussi lorsque l’utilisateur quitte le champ téléphone ?

Merci encore.

Il n’y a pas dans Smplicité de lib JavaScript cliente équivalente à la libphonenumber Java de Google utilisé par la classe PhoneNumTool.

Ce genre de lib JavaScript existe (ex: https://github.com/catamphetamine/libphonenumber-js) je ne sais pas ce que ça vaut mais vous pouvez toujours en ajouter spécifiquement (en tant que resource de la disposition globale default pour l’utiliser dans les scripts Javascript clent de vos objets.

Quoiqu’il en soit, ça restera du confort, le vrai contrôle/formattage de vos numéros de tel doit se faire avant tout coté serveur. Comme pour toute règle métier, ce qui se fait dans la UI coté client n’a strictement aucune valeur, notamment car ça ne s’applique pas quand on passe par une API ou un import I/O.