MediaWiki:Gadget-ding.js:修订间差异

wp>ESanders (WMF)
(Move bar to the bottom where it doesn't obstruct important parts of the UI (see MediaWiki_talk:Gadget-ding.js))
 
(导入1个版本)
 

2020年11月9日 (一) 17:45的最新版本

"use strict";
/*
ding ("message here should be safe html, beacuse you can write <button>Buttons</button>", "info" | "warning" | "success" | "default", "long" | 10000 <-- expiry time in ms )
*/
window.bldkDingExposedInterface = (function () {
    /**
     *
     * @param {string} message message here should be safe html, beacuse you can write <button>Buttons</button> in this
     * @param {string} type "info": dark blue/black, "warning": red/white, "success": green/white, "default": light blue/black (background/text)
     * @param {number|"long"} ttl number of microseconds before ding element disappears, "long" if the ding should not disappear after a timeout
     * @param {boolean} history does nothing currently
     * @param {boolean} persist If the element should go away when user clicks anywhere on it. If persist= true && ttl= long, make sure to include a button to allow the user to remove the banner
     */
    function ding(message, type, ttl, history, persist) {
        if (type === void 0) { type = "info"; }
        if (ttl === void 0) { ttl = 3500; }
        if (history === void 0) { history = true; }
        if (persist === void 0) { persist = false; }
        if (!document.getElementById("bluedeck_ding")) {
            document.body.insertAdjacentHTML("afterbegin", "<style>#bluedeck_ding button{margin: 0 0.2em; background:transparent; border:0.2em solid white; border-radius: 9em; padding: 0 0.7em; box-sizing: border-box; color: inherit; font-weight: inherit;}#bluedeck_ding button:active{background:rgba(255,255,255,0.6)}</style>");
            document.body.insertAdjacentHTML("afterbegin", "<div id='bluedeck_ding'></div>");
        }
        if (!document.getElementById("bluedeck_ding_history")) {
            document.body.insertAdjacentHTML("afterbegin", "<div id='bluedeck_ding_history'></div>");
        }
        var dingEle = document.getElementById("bluedeck_ding");
        var dingHistEle = document.getElementById("bluedeck_ding_history");
        var previousMessage = dingEle.lastChild;
        if (previousMessage) {
            previousMessage.style.transform = "translateY(-130%)";
            setTimeout(function () { previousMessage.remove(); }, 500);
        }
        var color_sets = {
            warning: { text: "rgba(255, 255, 255, 1)", background: "rgba(221, 51,  51,  1)" },
            info: { text: "rgba(255, 255, 255, 1)", background: "rgba(51,  102, 204, 1)" },
            success: { text: "rgba(255, 255, 255, 1)", background: "rgba(0,   175, 137, 1)" },
            confusion: { text: "rgba(0,   0,   0,   1)", background: "rgba(234, 236, 240, 1)" },
            "default": { text: "rgba(0,   0,   0,   1)", background: "rgba(234, 236, 240, 1)" }
        };
        var retractant = persist ? "" : "onclick='this.style.transform = \"translateY(-130%)\";setTimeout(function(){this.remove()}.bind(this), 500);' ";
        dingEle.insertAdjacentHTML("beforeend", "<div " +
            retractant +
            "style='" +
            "position:fixed; bottom:0; left:0; right:0; margin: 0 0 auto 0; height: auto; line-height: 1.4em; " +
            "padding: 0.6em 2em; opacity: 1; text-align: center; z-index: 9999; font-size: 86%; box-shadow: 0 2px 5px rgba(0,0,0,0.2); " +
            "font-weight: bold; transform: translateY(-130%); transition: all 0.2s;" +
            "background: " + color_sets[type].background + "; color:" + color_sets[type].text + "; ' " +
            ">" +
            message +
            "</div>");
        var noticeEle = dingEle.lastChild;
        setTimeout(function () { noticeEle.style.transform = "translateY(0%)"; }, 10);
        if (ttl !== "long") {
            setTimeout(function () { noticeEle.style.transform = "translateY(-130%)"; }, ttl + 10);
            setTimeout(function () { noticeEle.remove(); }, ttl + 510);
        }
    }
    return ding;
})();