User:Monster Domosed/common.js: Difference between revisions

No edit summary
Tag: Manual revert
No edit summary
Line 1: Line 1:
(function ($, mw) {


  function formatRelativeTime(timestamp) {
    var then = new Date(timestamp).getTime();
    var now = Date.now();
    var diffSeconds = Math.round((now - then) / 1000);
    var abs = Math.abs(diffSeconds);
    var value;
    var short;
    if (abs < 60) {
      short = 's';
      value = diffSeconds;
    } else if (abs < 3600) {
      short = 'm';
      value = Math.round(diffSeconds / 60);
    } else if (abs < 86400) {
      short = 'h';
      value = Math.round(diffSeconds / 3600);
    } else {
      short = 'd';
      value = Math.round(diffSeconds / 86400);
    }
    var n = Math.abs(value);
    return diffSeconds < 0 ? 'in ' + n + short : n + short + ' ago';
  }
  function renderWidget($root, items) {
    var $container = $('<div class="recent-edits-container"></div>');
    var $list = $('<ol class="recent-edits-list"></ol>');
    items.forEach(function (item) {
      var $li = $('<li class="recent-edits-item"></li>');
      var $title = $('<a class="recent-edits-title"></a>')
        .attr('href', mw.util.getUrl(item.title))
        .text(item.title);
      var $user;
      if (item.user) {
        $user = $('<a class="recent-edits-user"></a>')
          .attr('href', mw.util.getUrl('Special:Contributions/' + item.user))
          .text(item.user);
      } else {
        $user = $('<span class="recent-edits-user"></span>')
          .text('Unknown');
      }
      var $time = $('<time class="recent-edits-time"></time>')
        .attr('datetime', new Date(item.timestamp).toISOString())
        .text(formatRelativeTime(item.timestamp));
      var $meta = $('<div class="recent-edits-meta"></div>')
        .append($time)
        .append(document.createTextNode(' · '))
        .append($user);
      $li.append($title).append($meta);
      $list.append($li);
    });
    var $footer = $('<div class="recent-edits-footer"></div>');
    var $moreBtn = $('<a class="recent-edits-more" role="button"></a>')
      .attr('href', mw.util.getUrl('Special:RecentChanges'))
      .text('Show more...');
    $footer.append($moreBtn);
    $container.append($list).append($footer);
    $root.empty().append($container);
  }
  function loadRecentEdits($root) {
    var limit = parseInt($root.data('limit'), 10) || 5;
    return new mw.Api().get({
      action: 'query',
      list: 'recentchanges',
      rcprop: 'title|timestamp|user|ids|flags',
      rctype: 'edit|new',
      rcnamespace: 0,
      rclimit: limit
    }).then(
      function (data) {
        var items = [];
        if (data && data.query && data.query.recentchanges) {
          items = data.query.recentchanges;
        }
        renderWidget($root, items);
      },
      function () {
        $root.html(
          '<div class="recent-edits-error">Could not load recent edits.</div>'
        );
      }
    );
  }
  function initWidget($root) {
    var refreshMs = parseInt($root.data('refresh'), 10) || 300000;
    $root.html(
      '<div class="recent-edits-loading">Loading recent edits…</div>'
    );
    function refresh() {
      loadRecentEdits($root);
    }
    refresh();
    window.setInterval(refresh, refreshMs);
  }
  function injectSidebarWidget() {
    if ($('#p-recent-edits').length) {
      return $('#p-recent-edits .recent-edits-widget');
    }
    var $portlet = $(
      '<nav id="p-recent-edits" class="mw-portlet mw-portlet-recent-edits vector-menu-portal portal vector-menu" aria-labelledby="p-recent-edits-label">' +
        '<h3 id="p-recent-edits-label" class="vector-menu-heading">' +
          '<span class="vector-menu-heading-label">Recent Changes</span>' +
        '</h3>' +
        '<div class="vector-menu-content">' +
          '<div class="recent-edits-widget" data-limit="5" data-refresh="300000"></div>' +
        '</div>' +
      '</nav>'
    );
    if ($('#p-Community').length) {
      $('#p-Community').after($portlet);
    } else if ($('#p-Contribute').length) {
      $('#p-Contribute').after($portlet);
    } else {
      $('#mw-panel').append($portlet);
    }
    return $portlet.find('.recent-edits-widget');
  }
  $(function () {
    var $widget = $('.recent-edits-widget');
    if (!$widget.length) {
      $widget = injectSidebarWidget();
    }
    $widget.each(function () {
      initWidget($(this));
    });
  });
}(jQuery, mediaWiki));