Puffles Wiki
No edit summary
Tag: sourceedit
(unreviewed --> demoted test)
Tag: sourceedit
Line 228: Line 228:
 
 
 
$text = $text.replace(/{{demoted}}/g, "");
 
$text = $text.replace(/{{demoted}}/g, "");
  +
$text = $text.replace(/{{unreviewed}}/g, "demoted");
 
 
PCRS.buttonClick(
 
PCRS.buttonClick(
 
$text,
 
$text,

Revision as of 01:30, 5 September 2017

/**
 * PufflesContentReviewSystem.js
 * @file Implements a janked content review system for Puffles Wiki
 * @author Count of Howard <dev.wikia.com/wiki/User_talk:Count_of_Howard>
 * @license Apache-2.0
 * @require "mw"
 * @require "BannerNotification"
 * @require "mediawiki.util"
 */
 
/*jslint browser */
/*global mw, jQuery, window, BannerNotification */
 
require(["mw", "BannerNotification"], function (mw, BannerNotification) {
    "use strict";
 
    var $conf = mw.config.get([
        "stylepath",
        "wgPageName",
        "wgArticleId",
        "wgUserGroups",
        "wgUserLanguage",
        "wgNamespaceNumber"
    ]);
 
    var $hasRights = /(sysop|content-moderator)/
            .test($conf.wgUserGroups.join(" "));
 
    if (
        window.isPCRSLoaded ||
        $conf.wgNamespaceNumber !== 0 ||
        !$hasRights
    ) {
        return;
    }
    window.isPCRSLoaded = true;
 
    var $i18n = {
        "en": {
            demotedButtonText: "Demote",
            promotedButtonText: "Promote",
            demotedEditSummary: "Demoting article to quality review. Disagree? Contact me, an admin, or a content moderator.",
            promotedEditSummary: "Promoting article to fully published status. Disagree? Contact me, an admin, or a content moderator.",
            demotedSuccessBanner: "This article has been demoted.",
            promotedSuccessBanner: "This article has been promoted.",
            errorBanner: "An error was encountered.",
            reloadText: "Getting page..."
        }
    };
 
    var $lang = jQuery.extend(
        $i18n.en,
        $i18n[$conf.wgUserLanguage.split("-")[0]],
        $i18n[$conf.wgUserLanguage]
    );
 
    /**
     * @class PCRS
     * @classdesc The central PCRS class
     */
    var PCRS = {
        /**
         * @method showBanner
         * @param {string} $message
         * @param {string} $status
         * @returns {void}
         */
        showBanner: function ($message, $status) {
            var $statusClass = ($status === "error"
                ? "error"
                : "confirm");
            new BannerNotification($message, $statusClass).show();
        },
        /**
         * @method partialReload
         * @returns {void}
         */
        partialReload: function () {
            jQuery("#mw-content-text")
                .load(
                    window.location.href + " #mw-content-text > *",
                    function () {
                        jQuery(".WikiaArticle").stopThrobbing();
                        jQuery("#mw-content-text").fadeToggle(3000);
                    }
                );
        },
        /**
         * @method postContent
         * @param {string} $content
         * @param {string} $summary
         * @param {string} $successBanner
         * @param {string} $action
         * @param {string} $timestamp - optional
         * @param {string} $starttimestamp - optional
         * @param {string} $token - optional
         * @returns {void}
         */
        postContent: function (
            $content,
            $summary,
            $successBanner,
            $action,
            $timestamp,
            $starttimestamp,
            $token
        ) {
            var $params = {
                action: "edit",
                minor: true,
                title: $conf.wgPageName,
                summary: $summary,
                token: mw.user.tokens.get("editToken")
            };
 
            if ($action === "demote") {
                $params.prependtext = $content;
            } else if ($action === "promote") {
                $params.text = $content;
                $params.basetimestamp = $timestamp;
                $params.startimestamp = $starttimestamp;
                $params.token = $token;
            }
 
            jQuery.ajax({
                type: "POST",
                url: mw.util.wikiScript("api"),
                data: $params
            }).success(function ($data) {
                PCRS.showBanner($successBanner, "confirm");
                PCRS.partialReload();
            }).fail(function ($data) {
                PCRS.showBanner($lang.errorBanner, "error");
                PCRS.partialReload();
            });
        },
        /**
         * @method constructItem
         * @param {string} $text
         * @returns {mw.html.element}
         */
        constructItem: function ($text) {
            return mw.html.element("li", {
                "id": "PCRS-li"
            }, new mw.html.Raw(
                mw.html.element("a", {
                    "id": "PCRS-a",
                    "href": "#",
                    "title": $text
                }, $text)
            ));
        },
        /**
         * @method postContent
         * @param {string} $content
         * @param {string} $summary
         * @param {string} $banner
         * @param {string} $action
         * @param {string} $timestamp - optional
         * @param {string} $starttimestamp - optional
         * @param {string} $token - optional
         * @returns {void}
         */
        buttonClick: function (
            $content,
            $summary,
            $banner,
            $action,
            $timestamp,
            $starttimestamp,
            $token
        ) {
            jQuery("#PCRS-a").click(function () {
                jQuery("#mw-content-text").fadeToggle(1400);
                jQuery(".WikiaArticle").startThrobbing();
                jQuery("#mw-content-text")
                        .html("<img id='PCRS-throbber' src='" +
                        $conf.stylepath + "/common/images/ajax.gif' /> " +
                        $lang.reloadText);
 
                PCRS.postContent(
                    $content,
                    $summary,
                    $banner,
                    $action,
                    $timestamp,
                    $starttimestamp,
                    $token
                );
            });
        },
        /**
         * @method getWikitext
         * @param {function} callback
         * @returns {void}
         */
        getWikitext: function (callback) {
            jQuery.ajax({
                type: "GET",
                url: mw.util.wikiScript("api"),
                data: {
                    action: "query",
                    prop: "info|revisions",
                    intoken: "edit",
                    titles: $conf.wgPageName,
                    rvprop: "content|timestamp",
                    rvlimit: "1",
                    indexpageids: "true",
                    format : "json"
                }
            }).done(function ($data) {
                if (!$data.error) {
                    callback($data);
                }
            });
        },
        /**
         * @method handleWikitext
         * @param {json} $data
         * @returns {void}
         */
        handleWikitext: function ($data) {
            var $result = $data.query.pages[$conf.wgArticleId];
            var $text = $result.revisions[0]["*"];
            var $timestamp = $result.revisions[0].timestamp;
            var $starttimestamp = $result.starttimestamp;
            var $token = $result.edittoken;
 
            $text = $text.replace(/{{demoted}}/g, "");
            $text = $text.replace(/{{unreviewed}}/g, "demoted"); 
            PCRS.buttonClick(
                $text,
                $lang.promotedEditSummary,
                $lang.promotedSuccessBanner,
                "promote",
                $timestamp,
                $starttimestamp,
                $token
            );
        },
        /**
         * @method getTemplateData
         * @param {function} callback
         * @returns {void}
         */
        getTemplateData: function (callback) {
            jQuery.ajax({
                type: "GET",
                url: mw.util.wikiScript("api"),
                data: {
                    action: "query",
                    list: "embeddedin",
                    eititle: "Template:demoted",
                    format: "json"
                }
            }).done(function ($data) {
                if (!$data.error) {
                    callback($data);
                }
            });
        },
        /**
         * @method handleTemplateData
         * @param {json} $data
         * @returns {void}
         */
        handleTemplateData: function ($data) {
            var $pages = $data.query.embeddedin;
            var $pagesArray = [];
            var $menuElement;
 
            $pages.forEach(function ($page) {
                if ($page.ns === 0) {
                    $pagesArray.push($page.title.replace(/ /g,"_"));
                }
            });
 
            if (jQuery.inArray($conf.wgPageName, $pagesArray) === -1) {
                $menuElement = PCRS.constructItem($lang.demotedButtonText);
 
                jQuery($menuElement)
                    .prependTo(".page-header__contribution-buttons .wds-list");
 
                PCRS.buttonClick(
                    PCRS.template,
                    $lang.demotedEditSummary,
                    $lang.demotedSuccessBanner,
                    "demote"
                );
            } else {
                $menuElement = PCRS.constructItem($lang.promotedButtonText);
 
                jQuery($menuElement)
                    .prependTo(".page-header__contribution-buttons .wds-list");
 
                PCRS.getWikitext(PCRS.handleWikitext);
            }
        },
        /**
         * @method init
         * @returns {void}
         */
        init: function () {
            this.template = "{{demoted}}";
            this.getTemplateData(this.handleTemplateData);
        }
    };
 
    mw.loader.using("mediawiki.util").then(function () {
        PCRS.init();
    });
});