Retour à la documentation
define(["dojo/_base/declare", "dojo/dom-construct", "dojo/_base/array", "dojo/_base/window",
"spw/api/Toaster", "dojo/i18n!./nls/MessageManager", "dojo/_base/lang"],
function (declare, domConstruct, array, win, Toaster, labels, lang) {
var MessageManager = null;
MessageManager = declare("spw.api.MessageManager", null, /** @lends spw.api.MessageManager.prototype */{
messages: [],
messageDiv: null,
loadingDiv: null,
loadingHiderDiv: null,
imagesPath: null,
modalMessageDiv: null,
_notificationManager: null,
placementNode: null,
/**
* Le constructeur ne doit pas être appelé directement. MessageManager est une classe statique et doit être accédée via la méthode {@link spw.api.MessageManager.getInstance getInstance}.
* @classdesc Classe gérant l'affichage des messages et alertes dans le viewer.
* @constructs
*/
constructor: function(config){
if(config && config.placementNode){
this.placementNode = config.placementNode;
} else {
this.placementNode = win.body();
}
// var toasterDiv = domConstruct.create("div", {}, this.placementNode);
this._notificationManager = new Toaster({targetElement:this.placementNode, positionDirection: config.positionDirection});
this.imagesPath = require.toUrl("spw/api") + "/images/";
},
/**
* Affiche l'écran de chargement du viewer.
* @param {string} message Le message initial du chargement.
*/
displayLoading: function(message){
if(!this.loadingDiv){
var contentText = "<img src='"+this.imagesPath+"ajax-loader.gif' alt='Chargement...' /><br />" + message;
this.loadingHiderDiv = domConstruct.create("div", {
style:"position:absolute; top:0;bottom:0;left:0;right:0; background:white;z-index:50001;"
}, this.placementNode,"first");
this.loadingDiv = domConstruct.create("div", {
style:"width:100%;position:absolute; top:100px;text-align:center;font-size:16px;",
innerHTML:contentText
}, this.loadingHiderDiv);
} else {
this.setLoadingDetail(message);
}
},
/**
* Affiche un détail d'étape au chargement du viewer.
* @param {string} message le message de détail à afficher
*/
setLoadingDetail: function(message){
this.loadingDiv.innerHTML += " ... OK.<br />" + message;
},
/**
* Retire l'écran de chargement/initialisation du viewer.
*/
removeLoading: function(){
domConstruct.destroy(this.loadingDiv);
domConstruct.destroy(this.loadingHiderDiv);
this.loadingDiv = null;
this.loadingHiderDiv = null;
},
/**
* Affiche l'écran d'erreur du chargement du viewer
* @public
*/
displayLoadingError: function(message, contactMail, subjectMail, error){
this.messages.push(message);
var contentText = "<img src='"+this.imagesPath+"world-broken.jpg' alt='Loading error.' style='width:260px;height:200px;' />";
contentText += "<ul style='width:370px;margin:auto;'>";
array.forEach(this.messages, function(msg){
contentText += "<li style='text-align:left;'>"+msg+"</li>";
});
contentText += "</ul>";
if(contactMail != null && contactMail != ""){
if(subjectMail != null && subjectMail != ""){
contentText += "<a href=mailto:" + contactMail + "?subject="+escape(subjectMail)+">"+labels.contactSupport+"</a>";
}
else{
contentText += "<a href=mailto:" + contactMail + ">"+labels.contactSupport+"</a>";
}
}
if (error) {
contentText += "<p style=\"color: red;\">" + error + "</p>"
}
if(this.messageDiv == null){
var hiderDiv = domConstruct.create("div", { style:"position:absolute; top:0;bottom:0;left:0;right:0; background:white;z-index:50001;" }, this.placementNode,"first");
this.messageDiv = domConstruct.create("div", { style:"width:100%;position:absolute; top:20px;text-align:center;font-size:16px;", innerHTML:contentText}, hiderDiv);
} else {
this.messageDiv.innerHTML = contentText;
}
},
/**
* Affiche un message modal
* @param {string} htmlMessageContent html du message à afficher
*/
displayModalMessage: function(htmlMessageContent){
this.hideModalMessage();
this.modalMessageDiv = domConstruct.create("div",{}, this.placementNode, "first");
domConstruct.create("div", { style:"background-color:white;opacity:0.7;filter:Alpha(opacity=70);z-index:50000;top:0;bottom:0;left:0;right:0;position:absolute;" }, this.modalMessageDiv);
var fakeTable = domConstruct.create("div", { style:"z-index:50001;display:table;width:100%;height:100%;position:absolute;" }, this.modalMessageDiv);
var fakeCell = domConstruct.create("div", {style:"display: table-cell; text-align:center;vertical-align: middle;font-size: 18px;font-family: 'Lato';color: #4f8fa5;"}, fakeTable);
var innerDiv = domConstruct.create("div", {style:"opacity: 1;width: 400px;filter: Alpha(opacity=100);margin: auto;padding: 40px;border: 1px solid #4f8fa5;background-color: white;border-radius: 0;"}, fakeCell);
var innerSpan = domConstruct.create("span", {style:"opacity:1;filter:Alpha(opacity=100);"}, innerDiv);
domConstruct.create("img", {src: (require.toUrl("spw/api") + "/images/" + "ajax-loader.gif"), alt:"chargement"}, innerSpan);
innerSpan.innerHTML += "<br /><br />";
domConstruct.create("span", {innerHTML:htmlMessageContent}, innerSpan);
},
/**
* Cache le message modal
*/
hideModalMessage: function(){
if(this.modalMessageDiv){
domConstruct.destroy(this.modalMessageDiv);
this.modalMessageDiv = null;
}
},
/**
* see constants defined in SpwToaster for direction
*/
setNotificationPosition: function(direction){
this._notificationManager.setPositionDirection(direction);
},
/**
* Affiche un message de notification non bloquant à l'utilisateur
* @param {String} title
* @param {String} msg
* @param {String} duration la durée en ms de l'affichage du message (-1 = permanent)
* @param {String} défini le type du message : INFO ; WARN ; ERROR
*/
notify: function(title, msg, duration, type){
if(type == "ERROR"){
this._notificationManager.notifyError(title, msg, duration);
} else if (type == "WARN"){
this._notificationManager.notifyWarning(title, msg, duration);
} else {
this._notificationManager.notifyInfo(title, msg, duration);
}
},
/**
* Affiche un message d'erreur non bloquant à l'utilisateur
* @param {String} msg
* @param {String} title
* @param {String} duration la durée en ms de l'affichage du message (-1 = permanent)
*/
notifyError: function(msg, title, duration){
this._notificationManager.notifyError((title || labels.errorTitle), msg, (duration||-1));
},
/**
* Affiche un message d'attention non bloquant à l'utilisateur
* @param {String} msg
* @param {String} title
* @param {String} duration la durée en ms de l'affichage du message. 5 secondes par défaut.
*/
notifyWarning: function(msg, title, duration){
this._notificationManager.notifyWarning((title || labels.warningTitle), msg, (duration||5000));
},
/**
* Affiche un message d'information non bloquant à l'utilisateur
* @param {String} msg
* @param {String} title
* @param {String} duration la durée en ms de l'affichage du message. 5 secondes par défaut.
*/
notifyInfo: function(msg, title, duration){
this._notificationManager.notifyInfo((title || labels.infoTitle), msg, (duration||-1));
}
});
var _INSTANCE = null;
/**
* Permet de récupérer l'instance du MessageManager
* @method getInstance
* @memberof spw.api.MessageManager
* @returns spw.api.MessageManager
*/
MessageManager.getInstance = function(config){
if(_INSTANCE == null){
_INSTANCE = new MessageManager(config);
} else if(config){
lang.mixin(_INSTANCE, config);
}
return _INSTANCE;
};
return MessageManager;
});