MediaWiki:Gadget-formWizard-core.js
/* ______________________________________________________________________________________
* | |
* | === WARNING: GADGET FILE === |
* | Changes to this page affect many users. |
* | Please discuss changes on the talk page or on MediaWiki_talk:Gadgets-definition |
* | before editing. |
* |_____________________________________________________________________________________|
*
* See https://meta.wikimedia.org/wiki/Meta:FormWizard for usage and description.
- /
//
var formsGadget = {
'createDialog' : function(){
var that = this;
var dialogDict = {
dialogClass: 'formsGadget',
autoOpen: false,
//title: that.formDict.config['dialog-title'],
width: '495px',
modal: true,
closeOnEscape: true,
resizable: false,
draggable: false,
};
var dialog = $('#formsDialogExpand');
if(dialog.length){
this.dialog = dialog.dialog(dialogDict);
}
else{
this.dialog = $('
').dialog(dialogDict);}
dialog.append('
');},
'dialog' : null,
'openPanel': function(){
this.dialog.dialog('open');
},
'openDialog' : function () {
if (this.dialog === null){
this.createDialog();
}
else{
this.dialog.dialog('open');
}
},
'cleanupDialog': function (){
if (this.dialog){
this.dialog.dialog('destroy');
}
this.dialog = null;
$('#formsDialogExpand').text('');
},
'utilities' : {
/*
* Path to the gadget config file
*/
'configPath' : 'MediaWiki:Gadget-formWizard',
'apiUrl' : '//en.wikipedia.org/w/api.php?callback=?',
'gadgetNamespace' : function(){
var grant = mw.config.get('wgTitle').replace(/ /g,'_');
return grant;
},
/*
* To detect the users default language
*/
'userLanguage' : function(){
return mw.config.get('wgUserLanguage');
},
/*
* To detect the language of the page
*/
'contentLanguage' : function(){
return mw.config.get('wgContentLanguage');
},
/*
* Removes leading/trailing spaces & user signature
* ( It is added through the code)
*/
'cleanupText' : function(text){
text = $.trim(text)+' ';
var indexOf = text.indexOf('~~~~');
if ( indexOf == -1 ){
return text;
}
else{
return text.slice(0,indexOf)+text.slice(indexOf+4);
}
},
/*
* The config files which can be translated with the help of the
* translation tool generates the dict with the values having a
* lot of space in the key value pairs. This function strips the
* whitespace.
*/
'stripWhiteSpace' : function(dict){
for (key in dict){
dict[key] = typeof(dict[key]) == 'object' ? this.stripWhiteSpace(dict[key]) : $.trim(dict[key]);
}
return dict;
},
},
'formElement' : {
/*
* Elements being supported
* Small textbox
* Large textbox
* Checkbox list
* Radio button list
* Stepper list
* Image/s
* Dropdown
* Link
* Text
*/
'hiddenInfoboxFields' : [],
'found' : false,
'timestamp' : 0,
'defaultTextBoxConfig': {
'type': 'smallTextBox',
'placeholder': 'Enter the text',
'title': 'Textbox',
'characterLength':100,
'mandatory':false,
'error-messageLength': 'Max length reached',
'error-notFilled': 'Mandatory field',
'value': '',
'parent': '',
'id': null,
'comment': ''
},
'elementContainer' : function(){
var div = document.createElement('div');
div.className = 'elementContainer';
return div;
},
'addDescription': function(dict,div){
for (key in dict){
if(key.indexOf('text') != -1){
this.addText(div,dict[key],'text');
delete dict[key];
}
}
return div;
},
'checkTitle' : function(string,exists,titleStem,type){
var that = this;
//Url to the api
var apiUrl = formsGadget.utilities.apiUrl;
var title = titleStem + string;
var searchDict = {
'action':'query',
'format':'json',
'titles':title,
'prop':'imageinfo'
};
var timestamp = Date.now();
//console.log('String before ajax', string);
return $.getJSON(apiUrl,searchDict,function(data){
var query = data['query'];
var pages = data['query']['pages'];
var pageId = Object.keys(pages);
var pageExists = pageId != -1 ? true : false;
var imageExists = pages[pageId]['imagerepository'] ? true : false;
var value = 0;
if (type == 'image'){
value = imageExists;
}
else{
value = pageExists;
}
if(that.timestamp < timestamp){
that.timestamp = timestamp;
that.found = !(value ^ exists) ;
//console.log('String ',string, 'found ',that.found);
}
});
},
'inputList': function(type,list,title,dict,role){
var div = this.elementContainer();
div = this.addText(div,title,'title');
this.addDescription(dict,div);
for (elem in list){
var label = document.createElement('div');
var input = document.createElement('input');
var key = list[elem]['key'];
var value = list[elem]['value'];
input.type = type;
if (type == 'number'){
input.min = dict['min'];
input.max = dict['max'];
}
input.value = value;
input.setAttribute('data-add-to',dict['add-to']);
if(role){
input.setAttribute('data-role',true);
}
input.className = 'inputListItem';
input.setAttribute('data-add-to-attribute',key);
var descriptionText = key.replace(/_/g,' ');
descriptionText = descriptionText.slice(0,1).toUpperCase() + descriptionText.slice(1);
var description = document.createElement('span');
description.className = 'inputListItemDescription';
description.textContent = descriptionText;
label.appendChild(input);
label.appendChild(description);
div.appendChild(label);
}
return div;
},
'createTextBoxConfig':function(defaultConfig,actualConfig){
var config = {};
for (key in defaultConfig){
actualConfig[key] = key in actualConfig? actualConfig[key] : defaultConfig[key];
if (key == 'mandatory' && (typeof(actualConfig[key]) == 'string')){
if (actualConfig[key] == 'true'){
actualConfig[key] = true;
}
else{
actualConfig[key] = false;
}
}
}
return actualConfig;
},
'textBox': function(dict,type,callback,element){
var config = this.createTextBoxConfig(this.defaultTextBoxConfig,dict);
var className = type == 'small'? 'smallTextBox': 'largeTextBox';
var div = this.elementContainer();
div = this.addText(div,config['title'],'title');
this.addDescription(dict,div);
if (type == 'large'){
var input = document.createElement('textarea');
}
else{
var input = document.createElement('input');
}
//cleanup
if(dict['visibility'] == 'hidden'){
div.style['display'] = 'none';
input.value = dict['value'];
}
//Cleanup
if('page-title' in dict){
input.setAttribute('page-title',true);
}
if (dict['id']){
input.id = dict['id'];
}
input.setAttribute('type','text');
input.setAttribute('class',className);
input.setAttribute('placeholder',config['placeholder']);
input.setAttribute('maxlength',config['characterLength']);
input.setAttribute('data-mandatory',config['mandatory']);
input.setAttribute('data-comment',config['comment']);
input.setAttribute('data-add-to',config['add-to']);
var conditionalAttr = config['add-to'] == 'infobox' ? config['infobox-param'] : config['section-header'];
input.setAttribute('data-add-to-attribute',conditionalAttr);
var that = this;
/* Word limit */
$(input).on('change keyup paste',function(){
/* Checking if link/file/page exists */
var inputTextBox = this;
var enteredString = $(this).val();
if(!enteredString && !dict['mandatory']){
$('#formsDialogExpand [elemType="button"]').trigger('enableButtons');
$(inputTextBox).parent().removeClass('entrySatisfying entryNotSatisfying');
that.timestamp = Date.now();
that.found = true;
}
else{
if( 'validate' in dict && enteredString){
var exists = dict['validate'] == 'exists' ? 1:0;
var titleStem = 'image' in dict ? '' : that.formDict.config['page-home'];
$.when(that.checkTitle(enteredString,exists,titleStem,dict['type'])).then(function(){
//Cleanup & remove redundant code
$(inputTextBox).removeClass('entrySatisfying entryNotSatisfying');
$(inputTextBox).addClass(that.found ? 'entrySatisfying' : 'entryNotSatisfying');
$(inputTextBox).parent().removeClass('entrySatisfying entryNotSatisfying');
$(inputTextBox).parent().addClass(that.found ? 'entrySatisfying' : 'entryNotSatisfying');
if (that.found){
$('#formsDialogExpand [elemType="button"]').trigger('enableButtons');
if(typeof(callback) === 'function' && that.found){
//Api url
var apiUrl = formsGadget.utilities.apiUrl;
$.getJSON(apiUrl,{'action':'parse',
'format':'json',
'text':''+enteredString+''
},function(data){
//console.log(data['parse']['text']['*']);
var src = $('
if(src){
callback(element, src);
}
});
}
}
else{
$('#formsDialogExpand [elemType="button"]').trigger('disableButtons');
}
});
}
}
});
//To show validation
inputElementWrapper = document.createElement('span');
$(inputElementWrapper).addClass('inputElementWrapper');
if('validate' in dict){
$(inputElementWrapper).addClass('validationContainer');
}
if(dict['mandatory']){
$(inputElementWrapper).addClass('mandatoryContainer');
}
inputElementWrapper.appendChild(input);
div.appendChild(inputElementWrapper);
return div;
},
'smallTextBox': function (dict,callback,element) {
return this.textBox(dict,'small',callback,element);
},
'largeTextBox': function (dict,callback,element) {
return this.textBox(dict,'large',callback,element);
},
'checkboxList': function (dict) {
var list = dict['choiceList'];
var hidden = dict['hidden'];
if('hidden' in dict){
this.hiddenInfoboxFields = this.hiddenInfoboxFields.concat(dict['hidden']);
}
return this.inputList('checkbox',list,dict['title'],dict);
},
'addText': function(container,text,type){
var textHolder = $('
');
textHolder.text(text);
if (type == 'title'){
textHolder.addClass('title');
}
else if (type == 'text'){
textHolder.addClass('text');
}
else{
textHolder.addClass(type);
}
container.appendChild(textHolder[0]);
return container;
},
'text': function(dict){
var textHolder = $('
');
return textHolder.text(dict['string'])[0];
},
'stepperList': function (dict) {
var list = dict['choiceList'];
if('hidden' in dict){
this.hiddenInfoboxFields = this.hiddenInfoboxFields.concat(dict['hidden']);
}
dict['min'] = 0;
if(!('max' in dict)){
dict['max'] = 9;
}
return this.inputList('number',list,dict['title'],dict,true);
},
'dropdownList': function(dict){
var div = this.elementContainer();
div = this.addText(div,dict['title'],'title');
this.addDescription(dict,div);
var values = dict['values'];
var select = document.createElement('select');
select.setAttribute('class','dropdown');
select.setAttribute('data-placeholder',dict['placeholder']);
select.setAttribute('data-add-to',dict['add-to']);
select.setAttribute('data-add-to-attribute',dict['infobox-param']);
var option;
for (elem in values){
option = $('
select.appendChild(option[0]);
}
div.appendChild(select);
return div;
},
'link': function(dict){
var link = document.createElement('a');
link.href = 'href' in dict? dict['href'] : '//commons.wikimedia.org/wiki/Main_Page';
link.target = '_blank';
var innerText = 'link' in dict? dict['link'] : 'Search Wikimedia Commons for an image';
$(link).text(innerText);
return link;
},
'image': function (dict) {
var url = dict['url'];
var text = dict['title'];
dict['add-to'] = 'infobox';
dict['infobox-param'] = 'image';
dict['validate'] = 'exists';
//cleanup
dict['placeholder'] = 'placeholder' in dict ? dict['placeholder'] : 'File:Test.png';
var div = this.elementContainer();
this.addText(div,dict['title'],'title');
this.addDescription(dict,div);
var img = document.createElement('img');
img.src = url;
dict['title'] = 'imageTitleBox' in dict ? dict['imageTitleBox'] : 'Enter the file name';
//cleanup
dict['image'] = true;
var textbox = this.smallTextBox(dict,function(elem,src){
img.src = src;
},img);
div.appendChild(img);
div.appendChild(textbox);
var commonsLink = this.link(dict);
div.appendChild(commonsLink);
return div;
},
'button': function(type,text){
var a = document.createElement('input');
a.type='submit';
a.setAttribute('elemType','button');
if(type == 'cancel' || type == 'back'){
a.className = 'mw-ui-button cancel mw-ui-quiet';
}
else {
a.className = 'mw-ui-button mw-ui-constructive';
}
a.value = text;
$(a).on('disableButtons',function(){
$(this).attr('disabled',true);
});
$(a).on('enableButtons',function(){
$(this).attr('disabled',false);
});
return a;
},
'cancelButton': function(dict){
var button = this.button('cancel',dict['title']);
button.onclick = function(){
formsGadget.dialog.dialog('close');
};
return button;
},
'doneButton': function(dict){
var that = this;
var button = this.button('done',dict['title']);
button.onclick = function(){
that.validateForm();
};
return button;
},
'nextButton': function(dict){
var button = this.button('next',dict['title']);
var that = this;
button.onclick = function(){
$('#formsDialogExpand [step]').hide();
$('#formsDialogExpand'+' #'+dict['step']).next().show();
};
return button;
},
'backButton': function(dict){
var button = this.button('back',dict['title']);
var that = this;
button.onclick = function(){
$('#formsDialogExpand [step]').hide();
$('#formsDialogExpand'+' #'+dict['step']).prev().show();
};
return button;
},
'validateForm': function(){
var counter = 0;
var firstElem;
$('#formsDialogExpand [data-mandatory="true"]').each(function(){
var elem = $(this);
if(!elem.val()){
if (counter == 0){
firstElem = elem;
}
counter++;
elem.addClass('mandatoryInput');
}
});
//Add mandatory filed Event & styling
if(firstElem){
$('#formsDialogExpand [step]').hide();
while(true){
if (firstElem.attr('step')){
firstElem.show();
break;
}
firstElem = firstElem.parent();
}
}
else{
if (formsGadget.type == 'create'){
this.createWikiPage();
}
else{
this.modifyWikiPage();
}
}
},
'infoboxString': '',
'remainingSectionString': '',
'extractInfobox' : function(markup, infoboxTemplate){
var startIndex = markup.indexOf('{{' + infoboxTemplate);
var counter = 0;
var endIndex = 0;
for (i=startIndex;i if(markup[i] == '}' && markup[i+1] == '}'){ counter++; } if(markup[i] == '{' && markup[i+1] == '{'){ counter--; } if(counter == 0){ var endIndex = i+2; break; } } if (counter != 0){ return ''; } var infobox = { 'infobox' : markup.slice(startIndex,endIndex), 'before' : markup.slice(0,startIndex), 'after' : markup.slice(endIndex), }; return infobox; }, 'infoboxObjectify': function(infoboxString){ var paramRe = /( )*\|( )*[A-Za-z0-9_]+( )*=/gi; var units = infoboxString.split('\n'); var infobox = []; var infoboxParams = {}; var parts,line,param,value; for (unit in units){ line = units[unit]; if(line.search(paramRe) != -1){ parts = line.split('='); param = $.trim(parts[0].replace('|','')); value = $.trim(parts[1]); //infoboxParams[param] = value; infobox.push({'param': param, 'value': value}); } else{ infobox.push($.trim(line)); } } return infobox; }, 'modifyInfoboxParam': function(infobox,param,newValue){ var flag = true; for (elem in infobox){ if(typeof(infobox[elem]) == 'object' && infobox[elem]['param'] == param){ infobox[elem]['value'] = newValue; flag = false; } } if (flag){ infobox.splice(-1,0,{'param':param, 'value':newValue}); } return infobox; }, 'stringifyInfobox' : function(infobox){ var infoboxString = ''; for (elem in infobox){ if (typeof(infobox[elem]) == 'object'){ if(infobox[elem]['value']){ infoboxString = infoboxString + '|' + infobox[elem]['param'] + '=' + infobox[elem]['value'] + '\n'; } else{ infoboxString = infoboxString + '|' + infobox[elem]['param'] + '=' + '\n'; } } else{ infoboxString = infoboxString + infobox[elem] +'\n'; } } return infoboxString; }, 'createEditSummary' : function(title,subcomment){ var summary = ''; var formsConfig = formsGadget.formDict['config']; if (formsConfig['edit-comment-prefix']){ summary = formsConfig['edit-comment-prefix'] + ' '; } else{ summary = formsConfig['edit-comment-default'] + ' '; } if(subcomment){ summary = summary + title + ' (' + subcomment + ') '; } else{ summary = summary + title + ' '; } if (formsConfig['edit-comment-suffix']){ summary = summary + formsConfig['edit-comment-suffix']; } return summary; }, 'modifyWikiPage' : function(){ var that = this; var infobox = ''; var infoboxString = ''; var sections = ''; var api = new mw.Api(); var roots = this.wikiSectionTree.roots; for (elem in roots){ //console.log('---------'); this.wikiSectionTree.traverse([roots[elem]],1,function(id){ var elem = $('#formsDialogExpand #'+id); value = elem.val() ? elem.val() : ''; var heading = elem.attr('data-add-to-attribute'); return { 'heading': heading, 'value': value}; }); } //Disabling buttons on ajax post $('#formsDialogExpand [elemType="button"]').trigger('disableButtons'); //refractor hardcoding '/Toolkit' var title = mw.config.get('wgPageName').replace('/Toolkit',''); //Getting the infobox var gettingInfobox = api.get({ 'format':'json', 'action':'query', 'prop':'revisions', 'rvprop': 'content', 'rvslots': 'main', 'rvsection':0, 'titles': title, }).then(function(result){ var pages = result.query.pages; var key = Object.keys(result.query.pages)[0]; var content = pages[key]['revisions'][0]['slots']['main']['*']; var infoboxTemplate = formsGadget.formDict.config['infobox'] ? formsGadget.formDict.config['infobox'] : 'Probox/Idealab'; var elements = that.extractInfobox(content, infoboxTemplate); var infobox = that.infoboxObjectify(elements['infobox']); var before = elements['before']; var after = elements['after']; $('#formsDialogExpand [data-add-to]').each(function(index,elem){ var elem = $(elem); if(elem.attr('data-add-to') == 'infobox' ){ if(elem.attr('type') == 'checkbox'){ if (elem.is(':checked')){ infobox = that.modifyInfoboxParam(infobox,elem.attr('data-add-to-attribute'),elem.val()); } else{ infobox = that.modifyInfoboxParam(infobox,elem.attr('data-add-to-attribute'),null); } } else if(elem.attr('data-role')){ for (var i=0;i infobox = that.modifyInfoboxParam(infobox,elem.attr('data-add-to-attribute')+(i+1), null); } } else{ infobox = that.modifyInfoboxParam(infobox,elem.attr('data-add-to-attribute'),elem.val()); } } }); /* * infobox entries */ var hiddenFields = that.hiddenInfoboxFields; for(entry in hiddenFields){ infobox = infobox.push({'param':hiddenFields[entry]['key'],'value':hiddenFields[entry]['value']}); } modifiedSection = before + $.trim(that.stringifyInfobox(infobox)) + after; var formsConfig = formsGadget.formDict['config']; api.post({ 'action' : 'edit', 'title' : title, 'text' : modifiedSection, 'summary' : that.createEditSummary(title,'editing infobox parameters'), 'section': 0, 'watchlist':'watch', 'token' : mw.user.tokens.get('csrfToken') }).then(function(){ var newSections = '\n' + that.wikiSectionTree.sections; api.post({ 'action' : 'edit', 'title' : title, 'summary' : that.createEditSummary(title,'editing section'), 'appendtext':newSections, 'watchlist':'watch', 'token' : mw.user.tokens.get('csrfToken') }).then(function(){ // Redirecting to idea page //console.log('Successfully Added new sections & modified the infobox'); var postEditMessage = formsGadget.formDict['config']['post-edit']; //Cleanup formsGadget.dialog.dialog('close'); mw.cookie.set('formsGadgetNotify',postEditMessage); window.location.href = location.origin + '/wiki/' + title; }); }); }); }, 'createWikiPage' : function(){ var that = this; var infobox = ''; var page = ''; var api = new mw.Api(); var pageTitle = $('#formsDialogExpand [page-title]').val(); var roots = this.wikiSectionTree.roots; for (elem in roots){ //console.log('---------'); this.wikiSectionTree.traverse([roots[elem]],1,function(id){ var elem = $('#formsDialogExpand #'+id); value = elem.val() ? elem.val() : ''; var heading = elem.attr('data-add-to-attribute'); var comment = elem.attr('data-comment'); return { 'heading': heading, 'value': value, 'comment': comment }; }); } $('#formsDialogExpand [data-add-to]').each(function(index,elem){ var elem = $(elem); if(elem.attr('data-add-to') == 'section' ){ //var value = elem.val() ? elem.val() : ''; //var section = '==' + elem.attr('data-add-to-attribute') + '==' + '\n' + elem.val() + '\n'; //page = page + section; } else{ //Cleanup & Simplify if (elem.attr('data-role')){ for (var i=0;i infobox = infobox + '|'+ elem.attr('data-add-to-attribute') + (i+1) + '=\n'; } } else if(elem.attr('type') == 'checkbox'){ if (elem.is(':checked')){ infobox = infobox + '|'+ elem.attr('data-add-to-attribute') + '=' + elem.val() + '\n'; } else{ infobox = infobox + '|'+ elem.attr('data-add-to-attribute') + '=\n'; } } //Fix this hardcoding more elegantly else if(elem.attr('data-add-to-attribute') == 'image'){ var image = elem.val() ? elem.val() : elem.attr('placeholder'); infobox = infobox + '|'+ elem.attr('data-add-to-attribute') + '=' + image + '\n'; } else{ infobox = infobox + '|'+ elem.attr('data-add-to-attribute') + '=' + elem.val() + '\n'; } } }); /* * infobox entries */ var hiddenFields = this.hiddenInfoboxFields; for(entry in hiddenFields){ infobox = infobox + '|' + hiddenFields[entry]['key'] + '=' + hiddenFields[entry]['value'] + '\n'; } //Hardcoding creator/timestamp infobox = infobox + '|' + 'timestamp = ~~~~~' + '\n' ; infobox = infobox + '|' + 'creator = ' + mw.user.getName() + '\n' ; var probox = this.formDict.config['infobox'] ? this.formDict.config['infobox'] : 'Probox/Idealab'; infobox = '{{' + probox + '\n' + infobox + '}} \n'; page = infobox + this.wikiSectionTree.sections; /* * Creating a new page * */ var title = formsGadget.formDict['config']['page-home'] + pageTitle; //Disabling buttons on ajax post $('#formsDialogExpand [elemType="button"]').trigger('disableButtons'); api.post({ 'action': 'edit', //Cleanup 'title': title, 'summary': that.createEditSummary(title), 'text': page, 'watchlist':'watch', token: mw.user.tokens.get('csrfToken') }).then(function () { //Creating Idea Toolkit var formsConfig = formsGadget.formDict['config']; var toolkit = formsConfig['toolkit-name']; var toolkitContent = '{{' + formsConfig['toolkit-template'] + '}}'; var createToolkit = true; if (toolkit && toolkitContent){ var toolkitTitle = title + '/' + toolkit; var summary = 'Adding the toolkit for ' + title; createToolkit = api.post({ 'action': 'edit', //Cleanup 'title': toolkitTitle, 'summary': summary, 'text': toolkitContent, 'watchlist':'watch', token: mw.user.tokens.get('csrfToken') }); } // Redirecting to idea page //console.log('Successfully created new page'); $.when(createToolkit).then(function(){ formsGadget.dialog.dialog('close'); var postEditMessage = formsGadget.formDict['config']['post-edit']; mw.cookie.set('formsGadgetNotify',postEditMessage); window.location.href = location.origin + '/wiki/' + title; },function(){ $('#formsDialogExpand [elemType="button"]').trigger('enableButtons'); }); },function(){ $('#formsDialogExpand [elemType="button"]').trigger('enableButtons'); }); //console.log(title,page); } }, 'createForm' : function(formDict){ //cleanup fixing the fallbacks if( !formDict.config['page-home'].match(/\/$/) ){ formDict.config['page-home'] = formDict.config['page-home'] + '/'; } this.formDict = formDict; this.formElement.formDict = formDict; this.formElement.wikiSectionTree = this.wikiSectionTree; var dialogInternal = document.createElement('div'); //User not logged in if (! mw.user.getName()){ var errorMessage = formDict['config']['error-not-logged-in']; var errorDiv = document.createElement('div'); errorDiv.className = 'mw-ui-vform'; this.formElement.addText(errorDiv,errorMessage,'error'); dialogInternal.appendChild(errorDiv); } var counter = 0; for (step in formDict){ if (step != 'config'){ counter++; var stepDict = formDict[step]; var panel = document.createElement('div'); panel.id = step; if(counter != 1){ panel.style['display'] = 'none'; } panel.setAttribute('step',step); for (elem in stepDict){ elemDict = stepDict[elem]; elemDict['elem'] = elem; elemDict['step'] = step; elemDict['id'] = elem; panel.appendChild(this.formElement[elemDict.type](elemDict)); //Creating the hierarchial structure of the sections & subsections if (elemDict['add-to'] == 'section' ){ var parent = 'parent' in elemDict ? elemDict['parent'] : null; var node = elem; if(parent){ this.wikiSectionTree.addLink(parent,node); } else{ this.wikiSectionTree.addLink(node); } } } dialogInternal.appendChild(panel); } } $('#formsDialogExpand').append(dialogInternal); $('.formsGadget .dropdown').chosen({ disable_search: true, width: '50%', }); return true; }, 'Tree' : function(){ var rootList = {}; var nodeList = {}; this.sections = ''; this.roots = rootList; var Node = function(parent,child,id){ this.parent = parent; this.id = id; this.child = child; }; var getNode = function(id){ if (id in nodeList){ return nodeList[id]; } else{ var node = new Node(null,null,id); nodeList[id] = node; rootList[id] = node; return node; } }; this.addLink = function(startId,endId){ if (endId){ var startNode = getNode(startId); var endNode = getNode(endId); endNode.parent = startNode; if (startNode.child){ startNode.child.push(endNode); } else{ startNode.child = [endNode]; } delete rootList[endNode.id]; } else{ getNode(startId); } }; var sectionLevel = function(indent){ var string = ''; for (var i=0;i string = string + '='; } return string; }; this.traverse = function(rootList,level,callback){ if(!rootList){ return; } level++; var wikiSectionHeaderMarkup = sectionLevel(level); for (elem in rootList){ var root = rootList[elem]; var sectionValues = callback(root.id); var section = wikiSectionHeaderMarkup + sectionValues['heading'] + wikiSectionHeaderMarkup + '\n' ; var section = section + ( sectionValues['comment'] ? sectionValues['comment'] + '\n' : '' ) + sectionValues['value'] + '\n'; this.sections = this.sections + section; root = root.child; this.traverse(root,level,callback); } }; } }; $(function() { (function(){ var api = new mw.Api(); var utility = formsGadget.utilities; //Retrieving the post edit feedback if any var postEditMessage = mw.cookie.get('formsGadgetNotify'); if (postEditMessage){ //clearing the cookie mw.cookie.set('formsGadgetNotify', null); //displaying the post edit message mw.notify(postEditMessage,{autoHide:false}); } $('.wp-formsGadget').click(function(e){ e.preventDefault(); formsGadgetNamespace = utility.gadgetNamespace(); formsGadgetType = $(this).attr('data-type') || 'Idea'; formsGadgetMode = $(this).attr('data-mode') || 'create'; formsGadget.cleanupDialog(); formsGadget.openDialog(); formsGadget.openPanel(); $('#formsDialogExpand .loading').show(); var configFullPath = utility.configPath+'/'+formsGadgetNamespace+'/'+formsGadgetType; var configUrl = '//en.wikipedia.org/w/index.php?title='+encodeURIComponent(configFullPath)+'&action=raw&ctype=text/javascript'; var api = new mw.Api(); var promise = api.get({ 'format':'json', 'formatversion': 2, 'action':'query', 'prop':'revisions', 'rvprop': 'contentmodel', 'rvsection':0, 'titles': configFullPath, }); //Get the config for the language above $.when(jQuery.getScript(configUrl), promise).then(function(text, result){ if ( result[0].query.pages[0].revisions[0].contentmodel == 'javascript' ) { var config = utility.stripWhiteSpace(formsGadgetConfig[formsGadgetMode]); formsGadget['formDict'] = config; //Cleanup $('.formsGadget .ui-dialog-title').text(config.config['dialog-title']); formsGadget['wikiSectionTree'] = new formsGadget.Tree(); formsGadget.openDialog(); formsGadget.createForm(config); formsGadget.type = formsGadgetMode; formsGadget.openDialog(); $('#formsDialogExpand .loading').hide(); } }); }); })(); }); //