Diferencia entre revisiones de «MediaWiki:Gadget-RfDHelper.js»

De WikiMinecraft
Saltar a: navegación, buscar
(Página creada con «/*! * Some enhancement on RfD that is enabled by default just for admins * Originally was developed inside Merge.js by me but I decided to split it * It will add a quick...»)
 
(Sin diferencias)

Revisión actual del 09:00 9 abr 2014

/*!
 * Some enhancement on RfD that is enabled by default just for admins
 * Originally was developed inside Merge.js by me but I decided to split it
 * It will add a quick delete button near each header that is requested by merge.js
 * and will add a number near links button so admins can quickly detect an item has
 * not any back link then safely delete it. It also will check recent delete
 * log every 5 seconds and will make deleted item links on RfD red link
 * to prevent conflicts on deletion.
 * 
 * @author User:Ebraminio <ebrahim -at- gnu.org>
 * @license CC-Zero
 */

/*jslint indent: 2, regexp: true, unparam: true, browser: true*/
/*jshint unused: false*/
/*global mediaWiki, jQuery*/
(function ($, mw) {
  'use strict';

  /**
   * Get backlink (50 limited)
   */
  function getBackLinks(itemId, callback) {
    new mw.Api().get({
      action: 'query',
      list: 'backlinks',
      bltitle: itemId,
      blnamespace: 0,
      bllimit: 50,
      format: 'json'
    }).done(function (data) {
      callback($.map(data.query.backlinks, function (value) {
        return value.title;
      }));
    });
  }

  /**
   * Delete an item
   */
  function deleteItem(id, reason, callback) {
    new mw.Api().post({
      action: 'delete',
      title: id,
      reason: reason,
      token: mw.user.tokens.get('editToken')
    }).done(callback);
  }

  /**
   * Get recent deletions
   */
  function recentDeletions(callback) {
    new mw.Api().get({
      action: 'query',
      list: 'recentchanges',
      rctype: 'log',
      format: 'json',
      rcprop: 'title|loginfo'
    }).done(callback);
  }

  if (mw.config.get('wgPageName').indexOf('Wikidata:Requests_for_deletions') === 0 &&
      mw.config.get('wgAction') === 'view') {
    $(function () {
      var itemLinks = {};
      $('a[href^="/wiki/Q"]:not(.new)').each(function (i, x) { itemLinks[x.href.replace(/.*\//, '')] = x; });

      setInterval(function () {
        recentDeletions(function (r) {
          $.each(r.query.recentchanges, function (i, x) {
            if (x.ns !== 0 || x.logtype !== 'delete') { return; }
            $(itemLinks[x.title]).addClass('new');
            itemLinks[x.title] = undefined;
          });
        });
      }, 5000);

      $("#mw-content-text > p > .plainlinks").each(function (i, x) {
        var link = $(x).find('a:first'),
          deleteQuery = new mw.Uri(link.prop('href')).query,
          header,
          button;
        if (deleteQuery.action !== 'delete') {
          return;
        }

        header = link.parent().parent().prev().find('.mw-headline a');

        // add backlinks count
        getBackLinks(deleteQuery.title, function (backlinks) {
          var blcount = backlinks.length;
          if (blcount === 50) {
            blcount = '50+';
          }

          $('[href*="Special:WhatLinksHere"]', x).after(
            $('<span />')
              .css('color', blcount === 0 ? 'black' : 'red')
              .text(' (' + mw.language.convertNumber(blcount) + ')')
          );
        });

        // if deletion request is not done by merge.js and admin has not
        // `var rfdHero = true` on her/his common.js don't add quick delete button
        if (deleteQuery.wpReason.indexOf('Merge.js') === -1 && window.rfdHero !== true) {
          return;
        }

        // don't add delete button if is deleted already
        if (header.hasClass('new')) {
          return;
        }

        button = $('<button>', {
          title: 'Quick Delete',
          style: 'cursor: pointer'
        }).append($('<img />', {
          src: '//upload.wikimedia.org/wikipedia/commons/thumb/8/89/Symbol_delete_vote.svg/15px-Symbol_delete_vote.svg.png',
          width: '15',
          height: '15'
        })).click(function (x) {
          header.css('text-decoration', 'line-through');
          deleteItem(deleteQuery.title, deleteQuery.wpReason, function () {
            header.addClass('new');
          });
          // delete button after delete request
          button.remove();
        });
        // insert the button
        header.after(button);
      });
    });
  }
}(jQuery, mediaWiki));