Source: api/MessageManager.js

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;

});