User:MohandesWiki/fortest

From Wikiquote
Jump to navigation Jump to search

(function() {

   var MONTH_NAMES = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
   // Only on mainspace articles and mainspace talk pages
   if(mw.config.get('wgNamespaceNumber') > 1) {
       return;
   }
   var requires = [
       'jquery.ui',
       'mediawiki.api',
       '//en.wikipedia.org/w/index.php?title=User:YuviPanda/js-utils/underscore.js&action=raw&ctype=text/javascript',
       '//en.wikipedia.org/w/index.php?title=User:YuviPanda/js-utils/ClientTemplate.js&action=raw&ctype=text/javascript'
   ];

   var cssPath = '//en.wikipedia.org/w/index.php?title=User:YuviPanda/AssessmentBar.css&action=raw&ctype=text/css';

   // Loaded in externally
   var projectData = window.assBar.projectData; 

   function getArticleTitle(title) {
       // If in a talk page, returns original page title
       // Else returns title unmodified
       return title.replace(/^Talk:/i, "");
   }

   function loadScripts(scripts) {
       var deferreds = [];
       $.each(scripts, function(i, script) {
           if(script.match(/^(http:|https:|\/\/)/)) {
               // External script, use $.getScript
               deferreds.push($.getScript(script));
           } else {
               // Use mw.using, convert callbacks to deferreds
               var d = $.Deferred();
               mw.loader.using(script, function() {
                   d.resolve();
               }, function(err) {
                   d.reject(err);
               });
               deferreds.push(d);
           }
       });
       return $.when.apply($, deferreds);
   }

   var extractorRegex =  new RegExp("Template:(?:" + projectData.inputTemplates.join('");

   var ass = null; // Current assessment

   var api = null; // API wrapper

   var templates = null; // ClientTemplate instance

   function Assessment(project, data, rawText, title) {
       this.project = project;
       this.data = data;
       this.rawText = rawText;
       this.title = title
   }

   Assessment.prototype.toTemplate = function() {
       var template;
       var curDate = new Date();
       var dateString = MONTH_NAMES[curDate.getMonth()] + " " + curDate.getUTCFullYear();
       this.data['assess-date'] = dateString;
       template = "{{" + projectData.outputTemplate;
       $.each(this.data, function(key, value) {
           template += "|" + key + "=" + value;
       });
       template += "}}";
       return template;
   }

   Assessment.prototype.getDisplayData = function() {
       // Defaults in case they don't exist
       var displayData = {
           importance: "unassessed",
           'class': "unassessed"
       };
       $.each(this.data, function(key, value) {
           if(key === 'importance' || key === 'class') {
               if(!$.trim(value)) {
                   value = 'unassessed';
               }
           }
           if(value === 'yes' || value === 'y') {
               value = 'unassessed';
           }
           displayData[key] = value;
       });
       return displayData;
   }

   Assessment.prototype.getSubProjects = function() {
       var subProjects = {};
       $.each(this.data, function(key, value) {
           if(value.match(/y(es)?/i)) {
               value = "unassessed";
           }
           if($.inArray(key.replace(/-importance$/, ), projectData.subProjects) != -1 && value != "" && !subProjects[key]) {
               subProjects[key.replace(/-importance$/, )] = value;
           }
       });
       return subProjects;
   }

   Assessment.prototype.getActionItems = function() {
       var actionItems = {};
       var that = this;
       $.each(projectData.actionNeeded, function(i, action) {
           actionItems[action] = (that.data[action] === "yes");
       });
       return actionItems;
   }

   Assessment.prototype.removeSubProject = function(subProject) {
       delete this.data[subProject];
       delete this.data[subProject + "-importance"];
   }
   Assessment.prototype.addSubProject = function(subProject, importance) {
       this.data[subProject] = "yes";
       this.data[subProject + "-importance"] = importance;
   }
   Assessment.prototype.save = function() {
       var d = $.Deferred();
       // Kill 'auto' fields
       delete this.data['auto'];

       var text = this.rawText.replace(extractorRegex, this.toTemplate());

       api.post({
           action: 'edit',
           title: 'Talk:' + this.title,
           summary: 'Changed assessment status for ' + projectData.name + ' (via AssessmentBar)',
           text: text,
           token: mw.user.tokens.get('editToken')
       }, {
           ok: function(data) {
               d.resolve(data);
               console.log('Success!');
           }
       });
       return d;
   }

   Assessment.fromWikiText = function(text, title) {
       var match = text.match(extractorRegex);
       if(match === null) {
           return null;
       }
       var cleanTemplate = match[0].replace(/{|}|\n/g, );
       var parts = cleanTemplate.split('|');
       var tags = {};
       for(var i = 1; i < parts.length; i++) {
           console.log(parts[i]);
           var tag = parts[i].split('=');
           tags[$.trim(tag[0])] = $.trim(tag[1]).toLowerCase();
       }
       return new Assessment(parts[0], tags, text, title);
   }

   function bindAssBarEvents() {
       $("#assbar-save").click(function() {
           var that = this;
           $(that).text("Saving...");
           ass.save().done(function() {
               $(that).text("Save");
               if(mw.config.get('wgPageName').match(/^Talk/)) {
                   location.reload(true); // Hard refresh
               }
           });
           return false;
       });

       $(".assbar-action-item").change(function() {
           var action = $(this).parents(".assbar-item").attr('data-action');
           if($(this).is(':checked')) {
               ass.data[action] = 'yes';
           } else {
               delete ass.data[action];
           }
       });

       $(".assbar-importance, .assbar-class").change(function() {
           var project = $(this).parents(".assbar-item").attr('data-project');
           var value = $(this).val().replace("unassessed", "");
           if(project == projectData.name) {
               // Main Project 
               var what = $(this).hasClass("assbar-importance") ? "importance" : "class";
               ass.data[what] = value; 
           } else {
               // One of the sub projects
               ass.data[project] = "yes";
               ass.data[project + "-importance"] = value;
           }
       });

       $("#assbar-new-subproject-name").autocomplete({
           source: projectData.subProjects,
           autoFocus: true
       });

       $("#assbar-add-new-subproject").click(function() {
           $("#assbar-new-subproject-dialog").dialog({
               modal: true,
               title: "Add new Sub Project",
               buttons: {
                   "Add": function() {
                       var subProject = $("#assbar-new-subproject-name").val();
                       var importance = $("#assbar-new-subproject-importance").val();
                       if($.inArray(subProject, projectData.subProjects) === -1) {
                           alert("Invalid subproject chosen!");
                           return;
                       }
                       ass.addSubProject(subProject, importance.replace("unassessed", ""));

                       var dialog = this;
                       templates.getTemplate('NewSubProject').done(function(template) {
                           var displayData = {
                               project: projectData,
                               subProject: subProject,
                               importance: importance
                           };
                           $(template(displayData)).appendTo("#assbar-subprojects-list");
                           $(dialog).dialog("close");
                       });
                   }
               }
           });
           return false;
       });

       $(".assbar-subproject-delete").click(function() {
           var subProject = $(this).parents(".assbar-item").attr('data-project');
           var sure = confirm("Do you want to delete the sub project " + subProject + "?");
           if(sure) {
               ass.removeSubProject(subProject);
               $(this).parents(".assbar-item").fadeOut();
           }
           return false;
       });

   }

   mw.loader.load(cssPath, 'text/css');
   loadScripts(requires).done(function() {
           api = new mw.Api();
           templates = new ClientTemplate('User:YuviPanda/AssessmentBar');
           $(function() {

               var title = getArticleTitle(mw.config.get('wgPageName'));
               api.get({
                   action: "parse",
                   page: 'Talk:' +  title,
                   prop: 'wikitext'
               }, {
                   ok: function(data) {
                       ass = Assessment.fromWikiText(data.parse.wikitext['*'], title);
                       if(!ass) {
                           return;
                       }
                       a = ass;
                       templates.getTemplate('Toolbar').done(function(template) {
                           var displayAss = {
                               project: projectData,
                               subProjects: ass.getSubProjects(),
                               actionItems: ass.getActionItems(),
                               data: ass.getDisplayData()
                           };
                           $(template(displayAss)).appendTo("body");
                           bindAssBarEvents();
                       });
                   }
               });

           });
   });

})();