Système de notification

Bonjour,

afin de pouvoir rajouter des informations d’événements de maintenance sur le projet sur lequel je suis actuellement, je souhaiterai mettre en place une sorte de banderole sur l’IHM affichant, pour tous les utilisateurs de mon projet, la date de la prochaine livraison et/ou un bouton développé afin qu’il puisse envoyer un message sous forme de pop-up à tous les utilisateurs et où ils seraient obligeaient de valider cette pop-up pour pouvoir continuer à parcourir la platforme

Sauriez-vous si il est possible de faire cela ?
Cordialement,
KWu

[Platform]
Status=OK
Version=4.0.P23
BuiltOn=2020-01-10 17:30 (revision 51ec4c2ec0814956190ff9ff1bb6ffd6dde0801c)
DBPatchLevel=P23

Une page d’accueil (une View) est une page HTML que vous pouvez customiser comme vous le souhaitez y compris en lui faisant afficher une “popup” modale qui utilise des données que vous stockez quelque part: en dur, dans un objet métier, un paramètre système, un texte, etc.

Ex: en mettant ça dans la vue Home (home page du scope “Simplicité administrator”):

<div id="mymessage"></div>
<script>
var msg = "<strong>Hello world!</strong>";
$("#mymessage").html(msg);
$ui.info(msg);
</script>

Ca donne ça:

Bonjour,
Merci pour votre retour,
Mais de cette manière, la popup apparaitra en permanence à chaque fois que l’utilisateur se connecte non ?
C’est possible de développer un bouton qui sera le seul moyen de faire apparaître cette popup ?

Cordialement,
KWu

Vous pouvez utiliser le locastorage de votre navigateur pour vous rappeler que l’utilisateur à vu la popup.

Si vous gérer votre message dans un param système vous pouvez stocker un param utilisateur pour les utilisateurs qui ont vu le message

etc

Il y a plein d’approches possibles

Pour le coup, je voudrais l’effet inverse, le fais que avec un bouton, une popup apparait pour TOUS les utilisateurs, qu’ils aient vue la popup ou non

Si je comprends bien on parle donc ici plutôt de “push” de notifications en temps réel.

Simplicité embarque Google Firebase qui est fait pour ce genre de choses sous forme de notifications desktop (mais l’info transitant par chez Google donc en général ça ne plait/va pas à nos clients on premises).

Sinon vous pouvez fonctionner via websockets c’est une technologie adaptée au push ou vous pouvez faire du pull à intervalle régulier pour simuler du push mais ce ne sera pas vraiment du temps réel. Dans les deux cas c’est à implémenter dans le script global de la disposition “responsive” pour que ça soit executé globalement (i.e. dans la one page globale, donc independamment de là où sont les utilisateurs)

Bonjour,

Donc si je comprend bien, les websockets sont le seul moyen de pouvoir faire un envoie de message direct vers tous les utilisateurs afin de leur faire apparaître une popup c’est bien cela ? Si oui, comment cela marche-t-il et comment pourrais-je le mettre en place dans mon projet svp ?

Cordialement,
KWu

Non relisez ma réponse:

  1. pour du “vrai” push vous avez le choix entre vous appuyer sur Firebase (qui fera des notifs desktop) soit vous appuyer sur des websockets. Il y a déjà de la mécanique de websocket dans Simplicité il faut voir si on peut l’exploiter pour ça, mais déjà est-ce que votre infrastructure laisse passer ce protocole ? Je pose la question car certains reverse proxy cassent les websockets (soit immédiatement soit au bout d’un timeout court)

  2. il est toujours possible de simuler du push en faisant du pull à intervalle régulier, c’est comme cela qu’on fait depuis les débuts du web dans les années 90

Bref commencez par vérifier que les websockets fonctionnent chez vous et on verra ce qu’il convient de faire.

Bonjour,

Apres discussion, il se peut que effectivement les websockets ne puisse pas être la bonne stratégie pour le projet, devant lancer des notifications pour plusieurs localisations différentes, on ne peut pas être sur à 100% que aucun proxy ne bloquera le protocole
Pour Firebase, on considère que les notifications desktop ne sont pas assez visuel pour être sur que tous les utilisateurs aient le message en temps voulu

Ce qui nous laisse le choix les notifications par pull régulier, si j’ai bien compris cette stratégie, ca serait de créer une méthode qui se lancerai tous les x temps et qui ferait une vérification pour voir si il n’y a pas de message a afficher, est ce bien cela ? Si oui, comment peut-on créer cette méthode qui se lance tous les x temps ?

Cordialement,
KWu

C’est à implémenter en Javascript dans la ressource SCRIPT de la disposition responsive qui est faite pour ça.

Mais il faut déjà que vous configuriez quelque chose coté serveur pour contenir les infos à interroger et à présenter sous forme de popup en cas de réponse positive.

Attention il faut faire en sorte que ces appels soient le moins “couteux” possible car ils seront effectués en // par toutes les sessions actives.

Personnellement je gérerais ça dans un param système. Coté client je ferais un appel à ce param système (peu couteux) s’il est là j’afficherais une popup avec le message dans la valeur du param systeme, s’il n’est pas là j’attendrais X minutes et je recommencerais. Ou dans le genre.

Bonjour,

C’est justement la partie côté client dont je voudrais avoir plus d’information, a savoir comment faire pour que la méthode se lance tous les x temps, est ce que cela passe par de la configuration sur Simplicité qui lancerai le script, ou bien c’est une boucle directement dans le code, ou bien existe-t-il des alternatives adaptés pour cela ?

Cordialement,
KWu

J’ai donné ces infos : vous devez écrire du Javascript dans la ressource SCRIPT de la disposition responsive.

On parle de Javascript standard, pour les appels schédulés à intervalles régulier il faut utiliser setTimeout() cf. https://www.w3schools.com/jsref/met_win_settimeout.asp

Voilà un exemple de code qui fait ce que j’ai décrit:

(function($) {
	$(document).on("ui.ready", function() {
		function checkNotification() {
			$ui.getApp().getSysParam(function(msg) {
				console.log("Notification: " + msg)
				if (msg) {
					clearInterval(timer);
					$ui.alert({ title: "Notification", type: "info", content: msg, modal: true, onOk:  function() {
						timer = setInterval(checkNotification, 5000);
					} });
				}
			}, "MY_NOTIFICATION", { force: true });
		}
		var timer = setInterval(checkNotification, 5000);
	});
})(jQuery);

A noter que j’utilise setInterval et pas setTimeout pour simplifier le bouclage.

Attention : Cela nécessite toutefois un fix sur le service getSysParam qui ne gérait pas correctement le parametre force qui est requis das ce contexte. Le fix sera poussé sur toutes les branches et images Docker ce soir.

Bonjour,

Merci beaucoup pour votre aide, cela m’aide enormement pour l’avancement de mon projet
Par rapport à votre code, si je le comprend bien, la function checkNotification() va boucler sur elle-même toutes les 5secondes, cependant celà ne va-t-il pas déranger la continuité du projet à faire une telle boucle infini, ou bien la ressource SCRIPT de la disposition responsive est dans une thread indépendante ?

Cordialement,
KWu

Je ne comprends pas du tout ce que vous voulez dire par " déranger la continuité du projet"

Dans mon exemple c’est 1 appel toutes les 5s car c’était juste pour tester sans attendre trop longtemps entre chaque appel. Rien ne vous empêche bien entendu de mettre une valeur plus longue. Comme je l’ai dit précédement vous devez faire attention à ne pas faire des choses trop “couteuses” dans votre contexte d’usage

Pour le reste c’est du Javascript de base qui s’exécute dans un browser, votre question sur les threads - outre le fait que ça ne relève pas du support Simplicité - est sans objet cf. https://stackoverflow.com/questions/39879/why-doesnt-javascript-support-multithreading

Il faudrait soit ajouter dans ce polling un mémorisation des messages déjà affiché sur le front dans un tableau global. ou alors gérer ce paramètre system par utilisateur et le supprimer via setSysParam une fois affiché, sinon il va s’afficher en boucle toutes les n secondes.

Une autre approche est d’utiliser le système de notif de Firebase de Google, il a des API et un écran tout fait dans Simplicité pour envoyer des notifications sur mobile ou desktop (si l’utilisateur accepte de recevoir des notifications dans son navigateur), à une personne, des personnes, à un groupe ou tout le monde. https://docs.simplicite.io/documentation/99-misc/cordova.md

La gestion des notifications est un sujet à part entière de la prochaine V5 :

  • Si pas de Firebase installé, usage de websocket (push) ou a défaut d’un polling (pull) comme celui-ci
  • Messagerie = persistances des messages envoyés / lus
  • Suivre/S’abonner à des objets métier pour recevoir leurs activités (mise à jour) / bookmark

Firebase a été écarté, cf plus haut

J’ai proposé un système de notif unique = il y a le param system X ça affiche, il est pas là ça affiche rien

Le besoin initial c’est juste d’afficher une popup pour prévenir d’une opération de maintenance imminente.

On pourrait effectivement imaginer un mécanisme plus malin/souple/evolutif mais c’est pas le besoin exprimé ici.

Bonjour,

Quand je parlais de continuité du projet, je pensais au fait que vue que dans l’exemple on fait une boucle qui re-boucle sur elle-même sans s’arréter est ce que ca ne va pas bloquer les lignes de code qui se trouve après cette boucle. En fait, principalement je voulais savoir si je mets une boucle similaire à votre exemple, est ce que Simplicité va lire seulement le code de la boucle sans arrêt ou bien est ce qu’il peut lire en même temps le code qui se trouve après la boucle

Cordialement,
KWu

A nouveau on parle de Javascript de base, le setTimeout a été bien conçu par les concepteurs du JavaScript.

Ce forum est dédié à du support sur Simplicité, reportez vous à des tutoriaux JavaScript pour plus d’informations sur le fonctionnement de JavaScript.

PS: si vous aviez essayé mon code vous auriez vu que ça ne bloquait pas la page

Bonjour,

Effectivement, il n’y a pas l’air d’y avoir boucle infini avec le code,
Par ailleurs je viens d’essayer et j’avais une autre question du coup, j’ai l’impression de voir que si on change des valeurs dans les paramètres système, pour que cette valeur soit appliquée, il faut faire un clear cache, est-ce correct ? Si oui, y a-t-il une alternative à celà ?

Cordialement,
KWu