jizy-messenger
Version:
A simple JS DOM messaging library.
3 lines (2 loc) • 2.67 kB
JavaScript
/*! jMessenger v2.0.0 | 2025-08-19T20:22Z | [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=function(){let e=1;const t={},s={type:"message",persistant:!0,dismissible:!0,seethrough:!0,fixed:!1,timeout:4,label:"",style:""};return class{constructor(e="[data-jizy-messaging]"){this.$container=null,this.selector=e,this.config=s}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.parsed)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(s=>{if(e++,s.dataset.i=e,s.dataset.timeout){t[e]=setTimeout(()=>{this.closeMessage(s)},1e3*s.dataset.timeout),s.querySelector(".closer").addEventListener("click",()=>{this.closeMessage(s)})}}),this.$container.setAttribute("data-jizy-parsed",!0)}setConfig(e){this.config={...this.config,...e||{}}}add(s,i,n={}){if(n={...this.config,type:i||"message",i:e++,...n||{}},!s)return;if(s=s.trim(),!0===n.seethrough&&this.$container.classList.add("seethrough"),!0===n.fixed&&this.$container.classList.add("backgrounded"),"error"===n.type)n.style="danger";else n.style="success";const a=document.createElement("div");if(a.setAttribute("role","alert"),a.dataset.i=n.i,a.classList.add("alert"),a.classList.add("alert-"+n.style),a.innerHTML="<div>"+s+"</div>",!0===n.dismissible){a.classList.add("alert-dismissible");const e=document.createElement("button");e.classList.add("closer"),e.innerHTML='<span aria-hidden="true">×</span><span class="sr-only">'+JiZy.translate("CLOSE")+"</span>",e.addEventListener("click",()=>{this.closeMessage(a)}),a.appendChild(e)}this.$container.style.display="block",this.$container.appendChild(a),!1===n.persistant&&(t[n.i]=setTimeout(()=>{this.closeMessage(a)},1e3*n.timeout))}closeMessage(e){e.remove(),void 0!==t[e.dataset.i]&&(clearTimeout(t[e.dataset.i]),delete t[e.dataset.i]),this.check()}empty(){for(const e in t)clearTimeout(t[e]);this.$container.innerText="",this.$container.style.display="none",this.$container.classList.remove("seethrough"),this.$container.classList.remove("backgrounded"),i=1,t={}}check(){this.$container.innerText||(this.$container.innerText="",this.$container.style.display="none")}}}();e.jMessenger=t}("undefined"!=typeof window?window:this);