انتقل إلى المحتوى

مستخدم:Gerges/test.js

من ويكيبيديا، الموسوعة الحرة

ملاحظة: بعد الحفظ، قد يلزمك إفراغ الكاش لرؤية التغييرات.

mw.loader.using(['mediawiki.util', 'mediawiki.api', 'oojs-ui-windows', 'oojs-ui-core'], function() {
  if (mw.config.get('wgAction') != 'history') return;
  var RecoverEase = {};
  RecoverEase.config = {
    tage: '',
    ad: '([[meta:User:Gerges/Gadget/RecoverEase|RecoverEase]])',
    disable: []
  };
  if (typeof RecoverEase.config !== 'undefined') {
    Object.assign(RecoverEase.config, window.RecoverEase);
  }
  if ($.inArray(mw.config.get('wgServerName'), RecoverEase.config.disable) === false) {
    return;
  }

  // Functions 
  function restoreEdits(api, revid, input, i18n) {
    var deferred = $.Deferred();
    try {
      api.get({
        action: 'query',
        prop: 'revisions',
        revids: revid,
        rvprop: 'timestamp',
        formatversion: '2'
      }).then(function(data) {
        var dateObject = new Date(data.query.pages[0].revisions[0].timestamp);
        dateObject.setSeconds(dateObject.getSeconds() + 1);
        const rvstart = dateObject.toISOString();
        api.get({
          action: 'query',
          prop: 'revisions',
          titles: mw.config.get('wgPageName'),
          rvlimit: 'max',
          rvprop: 'user',
          rvdir: 'newer',
          rvstart: rvstart,
          formatversion: '2'
        }).then(function(data) {

          const users = data.query.pages[0].revisions.map(revision => revision.user);
          const uniqueUsers = [...new Set(users)];
          const numOfUsers = uniqueUsers.length;
          let usersString;

          if (numOfUsers === 1) {
            usersString = mw.message('RecoverEase-summary_user', uniqueUsers[0]).toString();
          } else if (numOfUsers === 2) {
            usersString = `${mw.message('RecoverEase-summary_user', uniqueUsers[0])} ${mw.message('RecoverEase-and')}${mw.message('RecoverEase-summary_user', uniqueUsers[1]).toString().toString().toString()}`;
          } else {
            const lastUser = uniqueUsers.pop();

            usersString = `${uniqueUsers.map(user => mw.message('RecoverEase-summary_user', user)).join(mw.message('RecoverEase-comma'))} ${mw.message('RecoverEase-and')}${mw.message('RecoverEase-summary_user', lastUser).toString().toString().toString().toString()}`;
          }

          if (input === '') {
            summaryRecover = mw.message('RecoverEase-summary', usersString).toString();
          } else {
            summaryRecover = `${mw.message('RecoverEase-summary', usersString).toString()} : ${input}`;
          }
          api.postWithEditToken({
            action: 'edit',
            pageid: mw.config.get('wgArticleId'),
            undo: mw.config.get('wgCurRevisionId'),
            undoafter: revid,
            summary: summaryRecover + RecoverEase.ad,
            tags: RecoverEase.tags
          }).then(function(data) {
            deferred.resolve();
          }, function(_, data) {
            deferred.reject([new OO.ui.Error(api.getErrorMessage(data))]);
          });
        }, function(_, data) {
          deferred.reject([new OO.ui.Error(api.getErrorMessage(data))]);
        });
      }, function(_, data) {
        deferred.reject([new OO.ui.Error(api.getErrorMessage(data))]);
      });
    } catch (error) {
      deferred.reject([new OO.ui.Error(error)]);
    }
    return deferred.promise();
  }

  RecoverEase.messages = {
    en: {
      'RecoverEase-name': 'RecoverEase',
      'RecoverEase-summary': 'Undid edits of $1 ',
      'RecoverEase-summary_user': '[[User:$1|$1]] ([[User talk:$1|Talk]])',
      'RecoverEase-and': 'and ',
      'RecoverEase-comma': ', ',
      'RecoverEase-dialog_run': 'Run',
      'RecoverEase-dialog_cancel': 'Cancel',
      'RecoverEase-dialog_placeholder': 'Reason for reversion',
      'RecoverEase-dialog_prompt': 'Reason:',
      'RecoverEase-successful': 'Revert successful.... Reloading in a sec'
    },
    ar: {
      'RecoverEase-name': 'المُستَعيد',
      'RecoverEase-summary': 'استرجاع تعديلات  $1 ',
      'RecoverEase-summary_user': '[[User:$1|$1]] ([[User talk:$1|نقاش]])',
      'RecoverEase-dialog_run': 'تنفيذ',
      'RecoverEase-dialog_cancel': 'إلغاء',
      'RecoverEase-dialog_placeholder': 'سبب الاسترجاع',
      'RecoverEase-dialog_prompt': 'السبب:',
      'RecoverEase-and': 'و',
      'RecoverEase-comma': '، ',
      'RecoverEase-successful': 'استرجعت التعديلات بنجاح... ستتم إعادة تحميل الصفحة خلال ثوان'
    }
  };


  if (undefined === RecoverEase.messages[mw.config.get('wgUserLanguage')]) {
    mw.messages.set(RecoverEase.messages['en']);
  } else {
    mw.messages.set(RecoverEase.messages[mw.config.get('wgUserLanguage')]);
  }

  RecoverEase.api = new mw.Api({
    ajax: {
      headers: {
        'Api-User-Agent': 'RecoverEase/1.1'
      },
      parameters: {
        errorformat: 'html',
        errorlang: mwConfig.wgUserLanguage,
        errorsuselocal: true
      }
    }
  });
  var rationaleRecoverInput;

  function addLink(item) {
    var revid = item.getAttribute('data-mw-revid');
    if (revid == mw.config.get('wgCurRevisionId')) return;
    var links = item.querySelector('.comment + .mw-changeslist-links');
    if (!links) return;

    var parent = document.createElement('span'),
      el = document.createElement('a');
    el.addEventListener('click', function() {
      function RecoverDialog(config) {
        RecoverDialog.super.call(this, config);
      }
      OO.inheritClass(RecoverDialog, OO.ui.ProcessDialog);
      RecoverDialog.static.name = 'RecoverDialog';
      RecoverDialog.static.title = mw.message('RecoverEase-name').toString();
      RecoverDialog.static.size = 'medium';
      RecoverDialog.static.actions = [{
        action: 'save',
        label: mw.message('RecoverEase-dialog_run').toString(),
        flags: ['primary', 'progressive']
          }, {
        label: mw.message('RecoverEase-dialog_cancel').toString(),
        flags: 'safe'
          }];
      RecoverDialog.prototype.initialize = function() {
        RecoverDialog.super.prototype.initialize.apply(this, arguments);
        this.content = new OO.ui.PanelLayout({
          padded: true,
          expanded: false
        });
        RecoverOptions = new OO.ui.FieldsetLayout({});
        RecoverOptions.addItems([new OO.ui.FieldLayout(rationaleRecoverInput = new OO.ui.TextInputWidget({
          placeholder: mw.message('RecoverEase-dialog_placeholder').toString(),
          indicator: 'required',
          value: '',
        }), {
          label: mw.message('RecoverEase-dialog_prompt').toString(),
          align: 'inline',
        })]);
        this.content.$element.append(RecoverOptions.$element);
        this.$body.append(this.content.$element);

      };

      RecoverDialog.prototype.getActionProcess = function(action) {
        dialog = this;
        if (action) {
          return new OO.ui.Process(function() {
            return restoreEdits(RecoverEase.api, revid, rationaleRecoverInput.value, RecoverEase.i18n)
              .then(function() {
                dialog.close();
                mw.notify(mw.message('RecoverEase-successful').toString());
                setTimeout(function() {
                  location.reload()
                }, 1500);
              });
          }, this);
        }
        return RecoverDialog.super.prototype.getActionProcess.call(this, action);
      };
      var windowManager = new OO.ui.WindowManager();
      $(document.body).append(windowManager.$element);

      var dialog = new RecoverDialog();
      windowManager.addWindows([dialog]);
      windowManager.openWindow(dialog);
    });
    el.textContent = mw.message('RecoverEase-name').toString() + ' test';
    parent.appendChild(el);
    links.appendChild(parent);
  }
  var parents = document.querySelectorAll('li[data-mw-revid]');
  for (var i = 0; i < parents.length; i++) {
    addLink(parents[i]);
  }
});