MediaWiki:DYK-nomination-wizard.js: Difference between revisions
Content deleted Content added
Refactored User:SD0001/DYK-helper.js for loading on a project using URL parameter |
per tper |
||
(9 intermediate revisions by 5 users not shown) | |||
Line 1:
/**
* DYK-nomination-wizard
*
* Wizard to easily create DYK nominations
*
* Loaded on [[Wikipedia:Did you know/Create new nomination]]
* using [[mw:Snippets/Load JS and CSS by URL]]
*
* Author: [[User:SD0001]]
*
*/
Line 28 ⟶ 29:
var NOMINATIONS_PAGE = 'Template talk:Did you know';
dyk.advert = ' ([[
// Calculating prose character count, code based on [[User:Shubinator/DYKcheck.js]] and [[User:Dr pda/prosesize.js]]
Line 44 ⟶ 45:
}
return charCount;
};
dyk.proseCharCount = function ($html) {
var charCount = 0, readable_text = '';
$html.find('> p').each(function(i, el) {
charCount += dyk.proseCharCountInNode(el);
readable_text += el.textContent.trim();
});
var wordCount = readable_text.split(/\s/).length;
var prosesizediv = document.getElementById('dyk-prosesize');
prosesizediv.textContent = 'Prose size: ' + wordCount + ' words, ' + charCount + ' characters';
if (charCount < 1500) {
prosesizediv.style.color = 'red';
Morebits.quickForm.element.generateTooltip(prosesizediv, {
tooltip: 'Article must have at least 1500 characters of prose to be eligible for DYK'
});
} else {
prosesizediv.style.color = 'green';
}
};
dyk.updateProseSize = function (form, article) {
if (!article) return;
// Speedy prose size calculation faster without API call if we were invoked from the article
try { // Just in case of issues with window.opener use
if (window.opener && opener.document.title === article + ' - Wikipedia') { // ideally should compare with MediaWiki:Pagetitle
var $html = $(opener.document.body).find('.mw-parser-output');
dyk.proseCharCount($html);
return;
}
} catch(e) { console.log(e); }
$('#dyk-prosesize').text('Prose size: calculating...').css('color', 'black');
new mw.Api().get({
Line 56 ⟶ 85:
}).then(function (json) {
if (article !== form.article.value) {
$('#dyk-prosesize').text('');
return; // input was changed, ignore this response
}
var $html = $(json.parse.text);
dyk.proseCharCount($html);
}).catch(function (code, error) {
if (code === 'missingtitle') {
$('#dyk-prosesize').text('Article does not exist!').css('color', 'red');
} else {
$('#dyk-prosesize').text(''); // empty it
console.error(error);
}
});
};
dyk.callback = function dykMainCallback(
var form = new Morebits.quickForm(
form.append({
type: 'div',
style: 'float: right; font-style: italic;',
id: 'dyk-prosesize'
});
Line 117 ⟶ 135:
label: 'on date: ',
name: 'date',
tooltip: 'The date
event: dyk.dateCheck // for the benefit of browsers that don't support a datepicker for date fields
});
Line 290 ⟶ 307:
name: 'qpq',
label: 'Reviewed: ',
tooltip: 'DYK nomination(s) you reviewed. This is
size: '50px',
value: NOMPAGE_PREFIX
});
form.append({
type: 'div',
name: 'qpq-required',
label: 'Number of QPQs required: <span id=dyk-qpq-count>calculating ...</span>'
});
form.append({
type: 'button',
Line 319 ⟶ 343:
type: 'div',
style: 'float: right; font-size: smaller;', //text-decoration: italic;',
label: $('<
.append(
'[[w:WP:DYKRULES|DYK rules]]' ].join(' • '))
).get()
});
Line 329 ⟶ 354:
var result = form.render();
// Attach to the page, #dyk-
$('#dyk-
dyk.updateProseSize(result, mw.util.getParamValue('article'));
Line 365 ⟶ 390:
'form.quickform div textarea.dyk-source { font-size: 110%; height: 35px; }' +
'form.quickform div textarea.dyk-comments { font-size: 125%; height: 35px; }'
);
Line 420 ⟶ 441:
$(Morebits.quickForm.getElementContainer(result.multiarticle)).css('margin-top', '10px');
// Show number of QPQs required
mw.loader.using('ext.gadget.libLua').then(function() {
return mw.libs.lua.call({
module: 'NewDYKnomination',
func: 'getRequiredQpqCount',
args: [mw.config.get('wgUserName')]
});
}).then(function(output) {
var [numQpqsNeeded, numPriorNoms] = output.split('\t').map(num => parseInt(num));
dyk.numQpqsRequiredPerArticle = numQpqsNeeded;
if (numQpqsNeeded === 2) {
$('#dyk-qpq-count').text('2, as DYK is currently in backlog mode and you have ' + numPriorNoms + ' past nominations');
} else if (numQpqsNeeded === 1) {
$('#dyk-qpq-count').text('1, as you have ' + numPriorNoms + ' past nominations');
} else if (numQpqsNeeded === 0) {
$('#dyk-qpq-count').text('0, as you have fewer than 5 past nominations');
} else {
$('#dyk-qpq-count').text('failed to calculate');
}
}).catch(function(err) {
$('#dyk-qpq-count').text('failed to calculate');
console.log(err);
});
};
Line 429 ⟶ 474:
var diff = curDate.getTime() - date.getTime();
if (date.toString() === 'Invalid date' || diff < 0) {
checkElem.textContent = 'Invalid date' + (diff < 0 ? '. Back from the future, are you?' : '');
checkElem.style.color = 'red';
return;
}
var diffdays = diff/(1000*60*60*24);
if (diffdays >=
$(checkElem).html(Morebits.createHtml('Date must be within the past week, see [[WP:DYK#New]]'));
checkElem.style.color = '
} else if (diffdays >= 8) {
checkElem.textContent = 'Possibly ineligible as date is not within the past week';
Line 449 ⟶ 494:
if (type === 'source') {
txtarea.previousElementSibling.style.borderTop = 'none';
txtarea.previousElementSibling.style.marginTop = '0';
Line 518 ⟶ 561:
addTemplateParam('status', params.status);
addTemplateParam('hook', params.hook + (params.source ? ('\n{{smalldiv|1= \n*
Object.keys(params).filter(function (field) {
Line 597 ⟶ 640:
}
var diffdays = diff/(1000*60*60*24);
if (diffdays >=
alert('The date specified is well outside the past week, and hence the article is ineligible for DYK, see WP:DYK#New');
return;
}
var prosesizewarn = $('#dyk-prosesize').css('color') === "rgb(255, 0, 0)";
if (prosesizewarn && !confirm('This article has
return;
}
if (sourcewarning && !confirm('You have not specified the source for each hook. Are you sure you want to continue?')) {
return;
}
if (dyk.numQpqsRequiredPerArticle > 0 &&
!/Template:Did you know nominations\/\w+/.test(form.qpq.value) &&
!confirm('You have not specified a QPQ. The nomination may be rejected unless you provide a QPQ soon after the nomination. Are you sure you want to continue?')) {
return;
}
Line 621 ⟶ 667:
Morebits.wiki.actionCompleted.redirect = NOMINATIONS_PAGE + '#' + dyk.articles.join(', ');
Morebits.wiki.actionCompleted.notice = 'Completed';
Morebits.wiki.api.setApiUserAgent('[[w:
var nompage = new Morebits.wiki.page(NOMPAGE_PREFIX + article, 'Creating nomination page');
Line 638 ⟶ 684:
if (pageText === newPageText) {
var linknode = document.createElement('a');
linknode.setAttribute("href", mw.util.getUrl("
linknode.appendChild(document.createTextNode('Repair nomination'));
dykpage.getStatusElement().error(['Could not find the target spot for the nomination. Please see: ', linknode, '.']);
|