Tento skript by neměl být instalován přímo. Jedná se o knihovnu, kterou by měly jiné skripty využívat pomocí meta příkazu // @require https://update.greasyfork.org/scripts/484331/1308737/customnotifications.js
var AWN;
(() => {
var e = {
628: (e, t, s) => {
"use strict";
s.d(t, {
default: () => m
});
const i = {
maxNotifications: 10,
animationDuration: 300,
position: "bottom-right",
labels: {
tip: "Tip",
info: "Info",
success: "Success",
warning: "Attention",
alert: "Error",
async: "Loading",
confirm: "Confirmation required",
confirmOk: "OK",
confirmCancel: "Cancel"
},
icons: {
tip: "question-circle",
info: "info-circle",
success: "check-circle",
warning: "exclamation-circle",
alert: "exclamation-triangle",
async: "cog fa-spin",
confirm: "exclamation-triangle",
prefix: "<i class='fa fas fa-fw fa-",
suffix: "'></i>",
enabled: !0
},
replacements: {
tip: null,
info: null,
success: null,
warning: null,
alert: null,
async: null,
"async-block": null,
modal: null,
confirm: null,
general: {
"<script>": "",
"<\/script>": ""
}
},
messages: {
tip: "",
info: "",
success: "Action has been succeeded",
warning: "",
alert: "Action has been failed",
confirm: "This action can't be undone. Continue?",
async: "Please, wait...",
"async-block": "Loading"
},
formatError(e) {
if (e.response) {
if (!e.response.data) return "500 API Server Error";
if (e.response.data.errors) return e.response.data.errors.map((e => e.detail)).join("<br>");
if (e.response.statusText) return `${e.response.status} ${e.response.statusText}: ${e.response.data}`
}
return e.message ? e.message : e
},
durations: {
global: 5e3,
success: null,
info: null,
tip: null,
warning: null,
alert: null
},
minDurations: {
async: 1e3,
"async-block": 1e3
}
};
class n {
constructor(e = {}, t = i) {
Object.assign(this, this.defaultsDeep(t, e))
}
icon(e) {
return this.icons.enabled ? `${this.icons.prefix}${this.icons[e]}${this.icons.suffix}` : ""
}
label(e) {
return this.labels[e]
}
duration(e) {
let t = this.durations[e];
return null === t ? this.durations.global : t
}
toSecs(e) {
return e / 1e3 + "s"
}
applyReplacements(e, t) {
if (!e) return this.messages[t] || "";
for (const s of ["general", t])
if (this.replacements[s])
for (const t in this.replacements[s]) e = e.replace(t, this.replacements[s][t]);
return e
}
override(e) {
return e ? new n(e, this) : this
}
defaultsDeep(e, t) {
let s = {};
for (const i in e) t.hasOwnProperty(i) ? s[i] = "object" == typeof e[i] && null !== e[i] ? this.defaultsDeep(e[i], t[i]) : t[i] : s[i] = e[i];
return s
}
}
const r = "awn-popup",
a = "awn-toast",
o = "awn-btn",
l = "awn-confirm",
c = {
prefix: a,
klass: {
label: `${a}-label`,
content: `${a}-content`,
icon: `${a}-icon`,
progressBar: `${a}-progress-bar`,
progressBarPause: `${a}-progress-bar-paused`
},
ids: {
container: `${a}-container`
}
},
d = {
prefix: r,
klass: {
buttons: "awn-buttons",
button: o,
successBtn: `${o}-success`,
cancelBtn: `${o}-cancel`,
title: `${r}-title`,
body: `${r}-body`,
content: `${r}-content`,
dotAnimation: `${r}-loading-dots`
},
ids: {
wrapper: `${r}-wrapper`,
confirmOk: `${l}-ok`,
confirmCancel: `${l}-cancel`
}
},
h = {
hiding: "awn-hiding"
},
u = class {
constructor(e, t, s, i, n) {
this.newNode = document.createElement("div"), t && (this.newNode.id = t), s && (this.newNode.className = s), i && (this.newNode.style.cssText = i), this.parent = e, this.options = n
}
beforeInsert() {}
afterInsert() {}
insert() {
return this.beforeInsert(), this.el = this.parent.appendChild(this.newNode), this.afterInsert(), this
}
replace(e) {
if (this.getElement()) return this.beforeDelete().then((() => (this.updateType(e.type), this.parent.replaceChild(e.newNode, this.el), this.el = this.getElement(e.newNode), this.afterInsert(), this)))
}
beforeDelete(e = this.el) {
let t = 0;
return this.start && (t = this.options.minDurations[this.type] + this.start - Date.now(), t < 0 && (t = 0)), new Promise((s => {
setTimeout((() => {
e.classList.add(h.hiding), setTimeout(s, this.options.animationDuration)
}), t)
}))
}
delete(e = this.el) {
return this.getElement(e) ? this.beforeDelete(e).then((() => {
e.remove(), this.afterDelete()
})) : null
}
afterDelete() {}
getElement(e = this.el) {
return e ? document.getElementById(e.id) : null
}
addEvent(e, t) {
this.el.addEventListener(e, t)
}
toggleClass(e) {
this.el.classList.toggle(e)
}
updateType(e) {
this.type = e, this.duration = this.options.duration(this.type)
}
},
p = class extends u {
constructor(e, t, s, i) {
super(i, `${c.prefix}-${Math.floor(Date.now()-100*Math.random())}`, `${c.prefix} ${c.prefix}-${t}`, `animation-duration: ${s.toSecs(s.animationDuration)};`, s), this.updateType(t), this.setInnerHtml(e)
}
setInnerHtml(e) {
"alert" === this.type && e && (e = this.options.formatError(e)), e = this.options.applyReplacements(e, this.type), this.newNode.innerHTML = `<div class="awn-toast-wrapper">${this.progressBar}${this.label}<div class="${c.klass.content}">${e}</div><span class="${c.klass.icon}">${this.options.icon(this.type)}</span></div>`
}
beforeInsert() {
if (this.parent.childElementCount >= this.options.maxNotifications) {
let e = Array.from(this.parent.getElementsByClassName(c.prefix));
this.delete(e.find((e => !this.isDeleted(e))))
}
}
afterInsert() {
if ("async" == this.type) return this.start = Date.now();
if (this.addEvent("click", (() => this.delete())), !(this.duration <= 0)) {
this.timer = new class {
constructor(e, t) {
this.callback = e, this.remaining = t, this.resume()
}
pause() {
this.paused = !0, window.clearTimeout(this.timerId), this.remaining -= new Date - this.start
}
resume() {
this.paused = !1, this.start = new Date, window.clearTimeout(this.timerId), this.timerId = window.setTimeout((() => {
window.clearTimeout(this.timerId), this.callback()
}), this.remaining)
}
toggle() {
this.paused ? this.resume() : this.pause()
}
}((() => this.delete()), this.duration);
for (const e of ["mouseenter", "mouseleave"]) this.addEvent(e, (() => {
this.isDeleted() || (this.toggleClass(c.klass.progressBarPause), this.timer.toggle())
}))
}
}
isDeleted(e = this.el) {
return e.classList.contains(h.hiding)
}
get progressBar() {
return this.duration <= 0 || "async" === this.type ? "" : `<div class='${c.klass.progressBar}' style="animation-duration:${this.options.toSecs(this.duration)};"></div>`
}
get label() {
return `<b class="${c.klass.label}">${this.options.label(this.type)}</b>`
}
},
f = class extends u {
constructor(e, t = "modal", s, i, n) {
let r = `animation-duration: ${s.toSecs(s.animationDuration)};`;
super(document.body, d.ids.wrapper, null, r, s), this[d.ids.confirmOk] = i, this[d.ids.confirmCancel] = n, this.className = `${d.prefix}-${t}`, ["confirm", "async-block", "modal"].includes(t) || (t = "modal"), this.updateType(t), this.setInnerHtml(e), this.insert()
}
setInnerHtml(e) {
let t = this.options.applyReplacements(e, this.type);
switch (this.type) {
case "confirm":
let e = [`<button class='${d.klass.button} ${d.klass.successBtn}'id='${d.ids.confirmOk}'>${this.options.labels.confirmOk}</button>`];
!1 !== this[d.ids.confirmCancel] && e.push(`<button class='${d.klass.button} ${d.klass.cancelBtn}'id='${d.ids.confirmCancel}'>${this.options.labels.confirmCancel}</button>`), t = `${this.options.icon(this.type)}<div class='${d.klass.title}'>${this.options.label(this.type)}</div><div class="${d.klass.content}">${t}</div><div class='${d.klass.buttons} ${d.klass.buttons}-${e.length}'>${e.join("")}</div>`;
break;
case "async-block":
t = `${t}<div class="${d.klass.dotAnimation}"></div>`
}
this.newNode.innerHTML = `<div class="${d.klass.body} ${this.className}">${t}</div>`
}
keyupListener(e) {
if ("async-block" === this.type) return e.preventDefault();
switch (e.code) {
case "Escape":
e.preventDefault(), this.delete();
case "Tab":
if (e.preventDefault(), "confirm" !== this.type || !1 === this[d.ids.confirmCancel]) return !0;
let t = this.okBtn;
e.shiftKey ? document.activeElement.id == d.ids.confirmOk && (t = this.cancelBtn) : document.activeElement.id !== d.ids.confirmCancel && (t = this.cancelBtn), t.focus()
}
}
afterInsert() {
switch (this.listener = e => this.keyupListener(e), window.addEventListener("keydown", this.listener), this.type) {
case "async-block":
this.start = Date.now();
break;
case "confirm":
this.okBtn.focus(), this.addEvent("click", (e => {
if ("BUTTON" !== e.target.nodeName) return !1;
this.delete(), this[e.target.id] && this[e.target.id]()
}));
break;
default:
document.activeElement.blur(), this.addEvent("click", (e => {
e.target.id === this.newNode.id && this.delete()
}))
}
}
afterDelete() {
window.removeEventListener("keydown", this.listener)
}
get okBtn() {
return document.getElementById(d.ids.confirmOk)
}
get cancelBtn() {
return document.getElementById(d.ids.confirmCancel)
}
};
class m {
constructor(e = {}) {
this.options = new n(e)
}
tip(e, t) {
return this._addToast(e, "tip", t).el
}
info(e, t) {
return this._addToast(e, "info", t).el
}
success(e, t) {
return this._addToast(e, "success", t).el
}
warning(e, t) {
return this._addToast(e, "warning", t).el
}
alert(e, t) {
return this._addToast(e, "alert", t).el
}
async (e, t, s, i, n) {
let r = this._addToast(i, "async", n);
return this._afterAsync(e, t, s, n, r)
}
confirm(e, t, s, i) {
return this._addPopup(e, "confirm", i, t, s)
}
asyncBlock(e, t, s, i, n) {
let r = this._addPopup(i, "async-block", n);
return this._afterAsync(e, t, s, n, r)
}
modal(e, t, s) {
return this._addPopup(e, t, s)
}
closeToasts() {
let e = this.container;
for (; e.firstChild;) e.removeChild(e.firstChild)
}
_addPopup(e, t, s, i, n) {
return new f(e, t, this.options.override(s), i, n)
}
_addToast(e, t, s, i) {
s = this.options.override(s);
let n = new p(e, t, s, this.container);
return i ? i instanceof f ? i.delete().then((() => n.insert())) : i.replace(n) : n.insert()
}
_afterAsync(e, t, s, i, n) {
return e.then(this._responseHandler(t, "success", i, n), this._responseHandler(s, "alert", i, n))
}
_responseHandler(e, t, s, i) {
return n => {
switch (typeof e) {
case "undefined":
case "string":
let r = "alert" === t ? e || n : e;
this._addToast(r, t, s, i);
break;
default:
i.delete().then((() => {
e && e(n)
}))
}
}
}
_createContainer() {
return new u(document.body, c.ids.container, `awn-${this.options.position}`).insert().el
}
get container() {
return document.getElementById(c.ids.container) || this._createContainer()
}
}
},
612: (e, t, s) => {
e.exports = s(628).default
}
},
t = {};
function s(i) {
var n = t[i];
if (void 0 !== n) return n.exports;
var r = t[i] = {
exports: {}
};
return e[i](r, r.exports, s), r.exports
}
s.d = (e, t) => {
for (var i in t) s.o(t, i) && !s.o(e, i) && Object.defineProperty(e, i, {
enumerable: !0,
get: t[i]
})
}, s.o = (e, t) => Object.prototype.hasOwnProperty.call(e, t);
var i = s(612);
AWN = i
})();