jizy-messenger
Version:
A simple JS DOM messaging library.
3 lines (2 loc) • 3.13 kB
JavaScript
/*! jMessenger v2.2.2 | MIT | 2026-07-20T17:47Z | [default] */
!function(e){"use strict";if("object"!=typeof e||!e||!e.document)throw new Error("jMessenger requires a window and a document");if(void 0!==e.jMessenger)throw new Error("jMessenger is already defined");var t=class{constructor(e="[data-jizy-messaging]"){this.$container=null,this.selector=e,this.currentMessage=0,this.timeouts={},this.config={type:"message",persistant:!0,dismissible:!0,seethrough:!0,fixed:!1,timeout:4,label:"",style:""}}setSelector(e){return this.selector=e,this}ready(){if(this.$container=document.querySelector(this.selector),this.$container){if(!(this.$container instanceof Element))throw new Error("Container is not a valid Element");if(this.$container.dataset.jizyParsed)return}else this.$container=document.createElement("div"),this.$container.classList.add("app-messages","seethrough"),this.$container.setAttribute("data-jizy-messaging","app"),document.body.appendChild(this.$container);this.$container.querySelectorAll(".alert").forEach(e=>{this.currentMessage++,e.dataset.i=this.currentMessage,e.dataset.timeout&&(this.timeouts[this.currentMessage]=setTimeout(()=>{this.closeMessage(e)},1e3*e.dataset.timeout));let t=e.querySelector(".closer");t&&t.addEventListener("click",()=>{this.closeMessage(e)})}),this.$container.setAttribute("data-jizy-parsed",!0)}setConfig(e={}){this.config={...this.config,...e}}add(e,t,s={}){if(s={...this.config,type:t||"message",i:this.currentMessage++,...s||{}},!e)return;switch(e=e.trim(),!0===s.seethrough&&this.$container.classList.add("seethrough"),!0===s.fixed&&this.$container.classList.add("backgrounded"),s.type){case"error":case"danger":s.style="danger";break;case"info":s.style="info";break;case"primary":s.style="primary";break;case"warning":s.style="warning";break;default:s.style="success"}const i=document.createElement("div");if(i.setAttribute("role","alert"),i.dataset.i=s.i,i.classList.add("alert"),i.classList.add("alert-"+s.style),i.innerHTML="<div>"+e+"</div>",!0===s.dismissible){i.classList.add("alert-dismissible");const e="undefined"!=typeof JiZy&&JiZy&&"function"==typeof JiZy.translate?JiZy.translate("CLOSE"):"Close",t=document.createElement("button");t.classList.add("closer"),t.innerHTML='<span aria-hidden="true">×</span><span class="sr-only">'+e+"</span>",t.addEventListener("click",()=>{this.closeMessage(i)}),i.appendChild(t)}this.$container.style.display="block",this.$container.appendChild(i),!1===s.persistant&&(this.timeouts[s.i]=setTimeout(()=>{this.closeMessage(i)},1e3*s.timeout))}closeMessage(e){e.remove(),void 0!==this.timeouts[e.dataset.i]&&(clearTimeout(this.timeouts[e.dataset.i]),delete this.timeouts[e.dataset.i]),this.check()}empty(){for(const e in this.timeouts)clearTimeout(this.timeouts[e]);this.$container.innerText="",this.$container.style.display="none",this.$container.classList.remove("seethrough"),this.$container.classList.remove("backgrounded"),this.currentMessage=0,this.timeouts={}}check(){this.$container.innerText||(this.$container.innerText="",this.$container.style.display="none")}};e.jMessenger=t}("undefined"!=typeof window?window:this);