No edit summary
Tag: Reverted
No edit summary
 
(12 intermediate revisions by the same user not shown)
Line 26: Line 26:
   });
   });
   element.addEventListener('click', (e) => {
   element.addEventListener('click', (e) => {
     // this will only get triggered on desktop
     // this will only get triggered on desktopg
     // because we call preventDefault for the "touchend" event
     // because we call preventDefault for the "touchend" event
     handler(e);
     handler(e);
Line 109: Line 109:
/* Jakes Recent Changes Portlet */
/* Jakes Recent Changes Portlet */
(function () {
(function () {
  /* ---------------- Recent changes ---------------- */
  var jakeRcPortletId = "p-jake-recentchanges";
  var jakeRcListId = "jake-rc-list";
  var jakeRcIntervalId = null;
  var jakeRcObserver = null;
   function jakeTimeAgo(date) {
   function jakeTimeAgo(date) {
     var s = Math.floor((Date.now() - date.getTime()) / 1000);
     var s = Math.floor((Date.now() - date.getTime()) / 1000);
Line 127: Line 120:
   }
   }


   function jakeGetMenu() {
   function jakeInjectStyles() {
     return (
     if (document.getElementById("jake-rc-style")) return;
      document.getElementById("vector-main-menu") ||
 
      document.querySelector("#mw-panel #vector-main-menu") ||
    var style = document.createElement("style");
       document.getElementById("mw-panel") ||
    style.id = "jake-rc-style";
       null
    style.textContent =
     );
      "#p-jake-recentchanges .vector-menu-heading{display:flex;align-items:center;justify-content:space-between;}" +
      "#p-jake-recentchanges .jake-rc-dot{width:8px;height:8px;border-radius:50%;background:#2da44e;box-shadow:0 0 0 2px rgba(45,164,78,.18);flex:0 0 auto;}" +
       "#p-jake-recentchanges .vector-menu-heading{font-size:.95em;}" +
      "#p-jake-recentchanges .vector-menu-content{font-size:.92em;}" +
       "#p-jake-recentchanges .jake-rc-meta{font-size:.85em;opacity:.85;}";
     document.head.appendChild(style);
   }
   }


   function jakeBuildPortlet() {
   function jakeBuildPortlet() {
     var menu = jakeGetMenu();
     var menu =
      document.getElementById("vector-main-menu") ||
      document.getElementById("mw-panel");
 
     if (!menu) return null;
     if (!menu) return null;
    if (document.getElementById("p-jake-recentchanges")) return null;


     var existingList = document.getElementById(jakeRcListId);
     jakeInjectStyles();
    if (existingList) return existingList;
 
    var existingPortlet = document.getElementById(jakeRcPortletId);
    if (existingPortlet) {
      var list = existingPortlet.querySelector("#" + jakeRcListId);
      return list || null;
    }


     var portlet = document.createElement("div");
     var portlet = document.createElement("div");
     portlet.id = jakeRcPortletId;
     portlet.id = "p-jake-recentchanges";
     portlet.className = "vector-menu mw-portlet";
     portlet.className = "vector-menu mw-portlet";


     var heading = document.createElement("div");
     var heading = document.createElement("div");
     heading.className = "vector-menu-heading";
     heading.className = "vector-menu-heading";
     heading.textContent = "Recent changes";
 
     var headingText = document.createElement("span");
    headingText.textContent = "Recent changes";
 
    var dot = document.createElement("span");
    dot.className = "jake-rc-dot";
    dot.setAttribute("aria-hidden", "true");
    dot.title = "Live";
 
    heading.appendChild(headingText);
    heading.appendChild(dot);


     var content = document.createElement("div");
     var content = document.createElement("div");
Line 162: Line 167:
     var ul = document.createElement("ul");
     var ul = document.createElement("ul");
     ul.className = "vector-menu-content-list";
     ul.className = "vector-menu-content-list";
     ul.id = jakeRcListId;
     ul.id = "jake-rc-list";


     var moreWrap = document.createElement("div");
     var moreWrap = document.createElement("div");
Line 170: Line 175:
     moreLink.href = mw.util.getUrl("Special:RecentChanges");
     moreLink.href = mw.util.getUrl("Special:RecentChanges");
     moreLink.textContent = "Show more…";
     moreLink.textContent = "Show more…";
    moreWrap.appendChild(moreLink);


    moreWrap.appendChild(moreLink);
     content.appendChild(ul);
     content.appendChild(ul);
     content.appendChild(moreWrap);
     content.appendChild(moreWrap);
Line 178: Line 183:
     portlet.appendChild(content);
     portlet.appendChild(content);


     var after =
     var discordPortlet = menu.querySelector("#p-Community");
      menu.querySelector("#p-Community") ||
    if (discordPortlet && discordPortlet.parentNode) {
       menu.querySelector("#p-navigation") ||
      discordPortlet.parentNode.insertBefore(portlet, discordPortlet.nextSibling);
       null;
    } else {
 
       var navPortlet = menu.querySelector("#p-navigation");
    if (after && after.parentNode) after.parentNode.insertBefore(portlet, after.nextSibling);
       if (navPortlet && navPortlet.parentNode) {
    else menu.appendChild(portlet);
        navPortlet.parentNode.insertBefore(portlet, navPortlet.nextSibling);
      } else {
        menu.appendChild(portlet);
      }
    }


     return ul;
     return ul;
   }
   }


   function jakeRenderRecentChanges(items) {
   function jakeLoadRecentChanges(ul) {
    var ul = document.getElementById(jakeRcListId) || jakeBuildPortlet();
     if (!ul) return;
     if (!ul) return;


     ul.textContent = "";
     var api = new mw.Api();
    api
      .get({
        action: "query",
        list: "recentchanges",
        rcnamespace: "0", /* 4 */
        rclimit: 5,
        rcprop: "title|timestamp|user",
        rcshow: "!bot",
        formatversion: 2
      })
      .then(function (data) {
        var items =
          data && data.query && data.query.recentchanges
            ? data.query.recentchanges
            : [];
 
        ul.textContent = "";


    if (!items || !items.length) {
        for (var i = 0; i < items.length; i++) {
      var li0 = document.createElement("li");
          var rc = items[i];
      li0.className = "mw-list-item jake-rc-item";


      var a0 = document.createElement("a");
          var li = document.createElement("li");
      a0.href = mw.util.getUrl("Special:RecentChanges");
          li.className = "mw-list-item jake-rc-item";
      a0.textContent = "View recent changes";


      li0.appendChild(a0);
          var a = document.createElement("a");
      ul.appendChild(li0);
          a.href = mw.util.getUrl(rc.title);
      return;
          a.textContent = rc.title;
    }


    for (var i = 0; i < items.length; i++) {
          var meta = document.createElement("div");
      var rc = items[i];
          meta.className = "jake-rc-meta";
          meta.textContent = jakeTimeAgo(new Date(rc.timestamp)) + " · " + (rc.user || "");


      var li = document.createElement("li");
          li.appendChild(a);
       li.className = "mw-list-item jake-rc-item";
          li.appendChild(meta);
          ul.appendChild(li);
        }
      })
       .catch(function () {
        ul.textContent = "";


      var a = document.createElement("a");
        var li = document.createElement("li");
      a.href = mw.util.getUrl(rc.title);
        li.className = "mw-list-item jake-rc-item";
      a.textContent = rc.title;


      var meta = document.createElement("div");
        var a = document.createElement("a");
      meta.className = "jake-rc-meta";
        a.href = mw.util.getUrl("Special:RecentChanges");
      meta.textContent = jakeTimeAgo(new Date(rc.timestamp)) + " · " + (rc.user || "");
        a.textContent = "View recent changes";


      li.appendChild(a);
        li.appendChild(a);
      li.appendChild(meta);
        ul.appendChild(li);
       ul.appendChild(li);
       });
    }
   }
   }


   function jakeFetchRecentChanges() {
   function jakeInitRecentChanges() {
     var ul = document.getElementById(jakeRcListId) || jakeBuildPortlet();
    if (!window.mw || !mw.util || !mw.Api) return;
 
     var ul = jakeBuildPortlet();
    if (!ul) ul = document.getElementById("jake-rc-list");
     if (!ul) return;
     if (!ul) return;


     var api = new mw.Api();
     jakeLoadRecentChanges(ul);
 
     setInterval(function () {
     api.get({
       jakeLoadRecentChanges(ul);
      action: "query",
     }, 60000);
      list: "recentchanges",
      rcnamespace: "0|4",
      rclimit: 5,
      rctype: "edit|new",
      rcprop: "title|timestamp|user",
      rcshow: "!bot",
      formatversion: 2
    }).then(function (data) {
       var items =
        data && data.query && data.query.recentchanges
          ? data.query.recentchanges
          : [];
      jakeRenderRecentChanges(items);
    }).catch(function () {
      jakeRenderRecentChanges([]);
     });
   }
   }


   function jakeWatchRecentChangesPortlet() {
   function jakeWaitForMenu() {
     if (jakeRcObserver) return;
     var tries = 0;


     jakeRcObserver = new MutationObserver(function () {
     var timer = setInterval(function () {
       var menu = jakeGetMenu();
       var menu =
      if (!menu) return;
        document.getElementById("vector-main-menu") ||
        document.getElementById("mw-panel");


       if (!document.getElementById(jakeRcPortletId)) {
       if (menu) {
         jakeBuildPortlet();
         clearInterval(timer);
         jakeFetchRecentChanges();
         jakeInitRecentChanges();
        return;
       }
       }
    });


     jakeRcObserver.observe(document.body, { childList: true, subtree: true });
      tries++;
      if (tries > 50) clearInterval(timer);
     }, 200);
   }
   }


   function jakeInitRecentChanges() {
   jakeWaitForMenu();
    jakeBuildPortlet();
})();
    jakeFetchRecentChanges();
 
    if (jakeRcIntervalId) clearInterval(jakeRcIntervalId);
    jakeRcIntervalId = setInterval(jakeFetchRecentChanges, 60000);
 
    jakeWatchRecentChangesPortlet();
  }
/* */
/* */
/*
(function () {
(function () {
   function jakeAddFeedbackToNamespaces() {
   function jakeAddFeedbackToNamespaces() {
Line 323: Line 333:
   } else {
   } else {
     jakeInit();
     jakeInit();
  }
})();
*/
/* */
(function () {
  function jakeAddFooterSocialRow() {
    var footer = document.getElementById("footer");
    if (!footer) return;
    var places = document.getElementById("footer-places");
    if (!places) return;
    if (document.getElementById("footer-social")) return;
    var ul = document.createElement("ul");
    ul.id = "footer-social";
    ul.className = "noprint crw-footer-social";
    function add(href, label) {
      var li = document.createElement("li");
      var a = document.createElement("a");
      a.href = href;
      a.textContent = label;
      a.setAttribute("aria-label", label);
      a.title = label;
      li.appendChild(a);
      ul.appendChild(li);
    }
    // add("https://discord.gg/8w5rSNAXRf", "Discord");
    add("https://www.linkedin.com/company/consumer-rights-wiki/", "LinkedIn");
    add("https://www.reddit.com/user/ConsumerRightsWiki/", "Reddit");
    places.parentNode.insertBefore(ul, places.nextSibling);
  }
  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", jakeAddFooterSocialRow);
  } else {
    jakeAddFooterSocialRow();
   }
   }
})();
})();