MediaWiki:Gadget-ToDoList.js

Napomena: Nakon objave možda ćete trebati očistiti međuspremnik svog preglednika kako biste vidjeli promjene.

  • Firefox / Safari: držite Shift i pritisnite Reload, ili pritisnite bilo Ctrl-F5 ili Ctrl-R (⌘-R na Macu)
  • Google Chrome: pritisnite Ctrl-Shift-R (⌘-Shift-R na Macu)
  • Internet Explorer / Edge: držite Ctrl i kliknite Refresh, ili pritisnite Ctrl-F5
  • Opera: pritisnite Ctrl-F5.
//ToDoLister
//Prilagođeno za hrwiki, preuzeto iz [[:en:User:Evad37/ToDoLister]]
/* Add any or all of these lines after the importScript line to set various options (the default values are shown):

	var todo_portlet = "p-personal";           // Defines which portlet menu the link is added to - see [[Help:Customizing toolbars]] for options (choose one of the valid values for portletId)
	var todo_subpage = "todo";                 // Subpage where the to-do list entry is to be added
	var todo_viewlabel = "View ToDo";          // Custom label for the link. Replace quoted text with your desired name.
	var todo_addlabel = "Add to ToDo";         // Custom label for the link. Replace quoted text with your desired name.
	var todo_addfirst = null;                  // Replace null with any value, e.g. "yes" (including quotation marks) to show the Add link before the View link.
	var todo_viewnew = null;                   // Replace null with any value, e.g. "yes" (including quotation marks) to make the View link open in a new tab or window.

*/

	
// <nowiki>
mw.loader.using(['mediawiki.util', 'mediawiki.api']).then(function() {
	mw.loader.load('//en.wikipedia.org/w/index.php?title=MediaWiki:Gadget-libExtraUtil.js&action=raw&ctype=text/javascript');
    // Set default options for any that haven't been set
    var getOption = function getOptionFn(option, val) {
        return (window[option] === undefined) ? val : window[option];
    };

    var getConfig = function() {
        return {
            portlet: getOption('todo_portlet', 'p-cactions'),
            subpage: getOption('todo_subpage', 'todo'),
            viewlabel: getOption('todo_viewlabel', 'Vidi popis zadataka'),
            addlabel: getOption('todo_addlabel', 'Dodaj na popis zadataka'),
            addfirst: getOption('todo_addfirst', null),
            viewnew: getOption('todo_viewnew', "yes"),
            mw: mw.config.get(['wgNamespaceNumber', 'wgPageName', 'wgUserName']),
            api: new mw.Api({
                ajax: {
                    headers: {
                        'Api-User-Agent': 'ToDoLister/2.0 ( https://en.wikipedia.org/wiki/User:Evad37/ToDoLister )'
                    }
                }
            })
        };
    };


    var addItemToList = function(config) {
        var comment = prompt("Unesite komentar uz stavku: ");
        if (comment === null) {
            return;
        }
	// Colon needed for File & Category namespaces
	var colonIsNeeded = ( config.mw.wgNamespaceNumber == 6 || config.mw.wgNamespaceNumber == 14 );
	var listItem = '\n<li id="{{subst:TRENUTAČNAOZNAKAVREMENA}}" class="popis-zadataka">[[' +
		( colonIsNeeded ? ':' : '' ) + '{{subst:#titleparts:' + config.mw.wgPageName +
		'}}]] ~~~~~ ' + comment + '</li>';

        //Perform edit to add entry
        var params = {
            action: 'edit',
                title: 'User:' + config.mw.wgUserName + '/' + config.subpage,
                appendtext: listItem,
                summary: 'Dodavanje stavke na popis zadataka: [[' + config.mw.wgPageName + ']]',
                tags: 'ToDoLister'
        };

        config.api.postWithToken('csrf', params)
            .done(function() {
                alert("Uspješno dodano.");
            })
            .fail(function(code, jqxhr) {
                alert(extraJs.makeErrorMsg(code, jqxhr));
            });
    };


    /* == Remove items from Todo list == */

    var queryPage = function(config, entryID) {
        return $.when(config.api.get({
            action: 'query',
            titles: 'User:' + config.mw.wgUserName + '/' + config.subpage,
            prop: 'revisions|info',
            rvprop: 'content',
            indexpageids: 1,
            rawcontinue: ''
        }), entryID, config);
    };

    var getWikitext = function(result, entryID, config) {
        var pageid = result[0].query.pageids;
        var wikitext = result[0].query.pages[pageid].revisions[0]['*'];
        return $.Deferred().resolve(wikitext, entryID, config);
    };

    var checkForItem = function(wikitext, entryID, config) {
        if (wikitext.indexOf('<li id="' + entryID + '"') < 0) {
            return $.Deferred().reject('Ne mogu pronaći stavku na popisu.');
        }
        return $.Deferred().resolve(wikitext, entryID, config);
    };

    var updateWikitext = function(wikitext, entryID, config) {
        var startOfItemToRemove = wikitext.indexOf("<li id=\"" + entryID + "\"");
        var endOfItemToRemove = wikitext.indexOf("</li>", startOfItemToRemove) + 6; // 6 = character in closing tag plus a newline
        var updatedWikitext = wikitext.substr(0, startOfItemToRemove) + wikitext.substr(endOfItemToRemove);

        var startOfPageRemoved = wikitext.indexOf("[[", startOfItemToRemove);
        var endOfPageRemoved = wikitext.indexOf("]]", startOfItemToRemove) + 2; // +2 accounts for the closing square brackets
        var pageRemoved = wikitext.substring(startOfPageRemoved, endOfPageRemoved);

        return $.Deferred().resolve(updatedWikitext, pageRemoved, config);
    };

    var editPage = function(updatedWikitext, pageRemoved, config) {
        var params = {
            action: 'edit',
            title: 'User:' + config.mw.wgUserName + '/' + config.subpage,
            text: updatedWikitext,
            summary: 'Uklanjanje stavke s popisa zadataka: ' + pageRemoved,
            tags: "ToDoLister"
        };

        return config.api.postWithToken('csrf', params);
    };

    removeEntry = function(entryID, config) {
        //first check click was intended
        var confirmation = confirm("Želite li zaista ukloniti ovu stavku s popisa?");
        if (!confirmation) {
            return;
        }

        queryPage(config, entryID)
            .then(getWikitext)
            .then(checkForItem)
            .then(updateWikitext)
            .then(editPage)
            .done(function() {
                alert("Uspješno uklonjeno.");
                location.reload();
            })
            .fail(function(code, jqxhr) {
                alert(extraJs.makeErrorMsg(code, jqxhr));
            });
    };


    var addScriptLinks = function(config) {
        //console.log("ToDo addLinks Ivi104");
        //insert view link
        var viewLink = mw.util.addPortletLink(
            config.portlet,
            '/wiki/User:' + config.mw.wgUserName + '/' + config.subpage,
            config.viewlabel,
            'todo_view'
        );
        if (config.viewnew !== null) {
            $(viewLink).find('a').attr('target', '_blank');
        }

        //insert add link
        var addLink = mw.util.addPortletLink(
            config.portlet,
            '#',
            config.addlabel,
            'todo_add',
            null,
            null,
            (config.addfirst !== null) ? '#todo_view' : null
        );
        $(addLink).click(function(e) {
            e.preventDefault();
            addItemToList(config);
        });

        //Show remove links on todo list
        $('li.popis-zadataka').each(function() {
            var id = this.id;
            $('<span>')
                .css('margin-left', '0.5em')
                .append([
                    "(",
                    $('<a>')
                    .text('izbriši')
                    .css('cursor', 'pointer')
                    .click(function() {
                        removeEntry(id, config);
                    }),
                    ")"
                ])
                .appendTo(this);
        });
    };

    /* == Setup == */
     addScriptLinks(getConfig());
    // console.log("ToDo success");
        });
// </nowiki>