Training materials upload progress bar
Append uploads to Training materials/Library subpage
Line 3,213: Line 3,213:
$slot.data('rbCampManualUpload', 1);
$slot.data('rbCampManualUpload', 1);


var PAGE = 'Training materials';
var LIBRARY = 'Training materials/Library';
var BEGIN = '<!-- BEGIN camp-manuals -->';
var END = '<!-- END camp-manuals -->';
var PLACEHOLDER = "''No manuals listed yet. Upload a PDF above and it will appear here.''";
var PLACEHOLDER = "''No manuals listed yet. Upload a PDF above and it will appear here.''";
var DOC_EXT = /\.(pdf|docx?|txt|rtf|odt|tiff?|jpe?g|png|gif|webp)$/i;
var DOC_EXT = /\.(pdf|docx?|txt|rtf|odt|tiff?|jpe?g|png|gif|webp)$/i;
Line 3,333: Line 3,331:


function appendToLibrary(api, filename, displayTitle, note) {
function appendToLibrary(api, filename, displayTitle, note) {
var bullet = buildBullet(filename, displayTitle, note);
return api.get({
return api.get({
action: 'query',
action: 'query',
prop: 'revisions',
prop: 'revisions|info',
titles: PAGE,
titles: LIBRARY,
rvprop: 'content',
rvprop: 'content|timestamp',
rvslots: 'main',
rvslots: 'main',
formatversion: 2
curtimestamp: 1,
formatversion: 2,
maxage: 0,
smaxage: 0
}).then(function (data) {
}).then(function (data) {
var page = data.query && data.query.pages && data.query.pages[0];
var page = data.query && data.query.pages && data.query.pages[0];
var text = (page && page.revisions && page.revisions[0] &&
var rev = page && page.revisions && page.revisions[0];
page.revisions[0].slots && page.revisions[0].slots.main &&
var text = (rev && rev.slots && rev.slots.main && rev.slots.main.content) || '';
page.revisions[0].slots.main.content) || '';
var basets = rev && rev.timestamp;
var start = text.indexOf(BEGIN);
var startts = data.curtimestamp;
var end = text.indexOf(END);
var next;
if (start === -1 || end === -1 || end <= start) {
var trimmed = $.trim(text);
throw new Error('Library markers missing on Training materials page');
if (!trimmed || trimmed.indexOf(PLACEHOLDER) !== -1) {
}
next = bullet + '\n';
var inner = text.substring(start + BEGIN.length, end).replace(/^\s+|\s+$/g, '');
} else if (trimmed.indexOf('[[Media:' + filename + '|') !== -1 ||
if (inner.indexOf(PLACEHOLDER) !== -1 || !inner) {
trimmed.indexOf('[[File:' + filename + '|') !== -1) {
inner = buildBullet(filename, displayTitle, note);
next = text;
} else {
} else {
inner = inner + '\n' + buildBullet(filename, displayTitle, note);
next = trimmed + '\n' + bullet + '\n';
}
}
var next = text.substring(0, start + BEGIN.length) + '\n' + inner + '\n' + text.substring(end);
var params = {
return api.postWithToken('csrf', {
action: 'edit',
action: 'edit',
title: PAGE,
title: LIBRARY,
text: next,
text: next,
summary: 'Add training material: ' + filename,
summary: 'Add training material: ' + filename,
format: 'json'
format: 'json'
};
if (basets) {
params.basetimestamp = basets;
}
if (startts) {
params.starttimestamp = startts;
}
return api.postWithToken('csrf', params).then(function (editData) {
if (editData.edit && editData.edit.result === 'Success') {
return editData;
}
if (editData.error && editData.error.code === 'editconflict') {
return appendToLibrary(api, filename, displayTitle, note);
}
throw new Error((editData.error && editData.error.info) || 'Could not update library list');
});
});
});
});