Widget:File upload: verschil tussen versies
Uit Dorpsbelang Den Hout
Regel 45: | Regel 45: | ||
function createFilename(filename){ | function createFilename(filename){ | ||
− | + | var output = settingsFilename; | |
− | + | var regex = /<(\w+)>/gm; | |
− | + | var m; | |
− | + | var name = filename.split('.')[0]; | |
− | + | var type = filename.split('.')[1]; | |
− | + | ||
− | while ((m = regex.exec(settingsFilename)) !== null) { | + | while ((m = regex.exec(settingsFilename)) !== null) { |
// This is necessary to avoid infinite loops with zero-width matches | // This is necessary to avoid infinite loops with zero-width matches | ||
if (m.index === regex.lastIndex) { | if (m.index === regex.lastIndex) { | ||
− | + | regex.lastIndex++; | |
− | } | + | } |
− | |||
// The result can be accessed through the `m`-variable. | // The result can be accessed through the `m`-variable. | ||
m.forEach((match, groupIndex) => { | m.forEach((match, groupIndex) => { | ||
Regel 63: | Regel 62: | ||
output = output.replace('<'+match+'>', name); | output = output.replace('<'+match+'>', name); | ||
}else{ | }else{ | ||
− | + | var input = fileInput.closest('form').querySelector('[name="'+match+'"]'); | |
− | + | if(input){ | |
− | + | val = input.value; | |
output = output.replace('<'+match+'>', val); | output = output.replace('<'+match+'>', val); | ||
− | + | } | |
− | |||
} | } | ||
− | + | // console.log(`Found match, group ${groupIndex}: ${match}`); | |
}); | }); | ||
− | } | + | } |
− | return output+'.'+type; | + | return output+'.'+type; |
} | } | ||
function createWikitext(filename, caption){ | function createWikitext(filename, caption){ | ||
− | + | var output = settingsFilepageparameters; | |
− | + | var regex = /<(\w+)>/gm; | |
− | + | var m; | |
− | + | var name = filename.split('.')[0]; | |
− | + | var type = filename.split('.')[1]; | |
− | + | ||
− | while ((m = regex.exec(settingsFilepageparameters)) !== null) { | + | while ((m = regex.exec(settingsFilepageparameters)) !== null) { |
// This is necessary to avoid infinite loops with zero-width matches | // This is necessary to avoid infinite loops with zero-width matches | ||
if (m.index === regex.lastIndex) { | if (m.index === regex.lastIndex) { | ||
− | + | regex.lastIndex++; | |
− | } | + | } |
− | |||
// The result can be accessed through the `m`-variable. | // The result can be accessed through the `m`-variable. | ||
m.forEach((match, groupIndex) => { | m.forEach((match, groupIndex) => { | ||
Regel 95: | Regel 92: | ||
output = output.replace('<'+match+'>', name); | output = output.replace('<'+match+'>', name); | ||
}else{ | }else{ | ||
− | + | var input = fileInput.closest('form').querySelector('[name="'+match+'"]'); | |
− | + | if(input){ | |
− | + | val = input.value; | |
output = output.replace('<'+match+'>', val); | output = output.replace('<'+match+'>', val); | ||
− | + | } | |
− | + | ||
} | } | ||
− | + | // console.log(`Found match, group ${groupIndex}: ${match}`); | |
}); | }); | ||
− | } | + | } |
output = output.replace(':','='); | output = output.replace(':','='); | ||
output = output.replace(';','|'); | output = output.replace(';','|'); | ||
Regel 112: | Regel 109: | ||
output = '{{'+settingsFilepagetemplate+'|'+output+'|type='+type+'}}'; | output = '{{'+settingsFilepagetemplate+'|'+output+'|type='+type+'}}'; | ||
} | } | ||
− | return output; | + | return output; |
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | function handleFileSelect() { | |
− | + | if(settingsPreview != "false"){ | |
− | + | createPreviews(fileInput.files); | |
− | fileInput.closest('form').querySelector('[type="submit"]').addEventListener('click', uploadFiles, false) | + | } |
− | + | fileInput.closest('form').querySelector('[type="submit"]').addEventListener('click', uploadFiles, false) | |
} | } | ||
Regel 133: | Regel 122: | ||
evt.preventDefault(); | evt.preventDefault(); | ||
if(dropped){ | if(dropped){ | ||
− | var files = dropped; | + | var files = dropped; |
}else{ | }else{ | ||
− | + | var files = fileInput.files; | |
} | } | ||
− | var proms = []; | + | var proms = []; |
− | + | for(i = 0; i < files.length; ++i){ | |
− | + | file = files[i]; | |
− | + | var fileName = files[i].name; | |
− | + | var prom = doApiCall(file, fileName); | |
− | + | proms.push(prom) | |
− | + | } | |
− | + | Promise.all(proms).then(function(values) { | |
− | + | fileInput.closest('form').submit(); | |
− | + | }); | |
} | } | ||
function doApiCall(fileToUpload,fileName){ | function doApiCall(fileToUpload,fileName){ | ||
− | return new Promise(function(resolve, reject){ | + | return new Promise(function(resolve, reject){ |
− | formdata = new FormData(); | + | formdata = new FormData(); |
− | formdata.append("action", "upload"); | + | formdata.append("action", "upload"); |
− | formdata.append("filename", createFilename(fileName)); | + | formdata.append("filename", createFilename(fileName)); |
− | //formdata.append("filename", fileName); | + | //formdata.append("filename", fileName); |
− | formdata.append("token", mw.user.tokens.get( 'editToken' ) ); | + | formdata.append("token", mw.user.tokens.get( 'editToken' ) ); |
− | formdata.append("file", fileToUpload); | + | formdata.append("file", fileToUpload); |
− | formdata.append("ignorewarnings", "true"); | + | formdata.append("ignorewarnings", "true"); |
− | formdata.append("format", "json"); | + | formdata.append("format", "json"); |
− | + | ||
− | + | ||
− | //as we now have created the data to send, we send it... | + | //as we now have created the data to send, we send it... |
− | $.ajax( { //http://stackoverflow.com/questions/6974684/how-to-send-formdata-objects-with-ajax-requests-in-jquery | + | $.ajax( { //http://stackoverflow.com/questions/6974684/how-to-send-formdata-objects-with-ajax-requests-in-jquery |
− | + | url: mw.util.wikiScript( 'api' ), //url to api.php | |
− | + | contentType:false, | |
− | + | processData:false, | |
− | + | type:'POST', | |
− | + | data: formdata,//the formdata object we created above | |
− | + | success:function(data){ | |
− | + | resolve(data) | |
− | + | // setTimeout(function(){ | |
− | + | editFilePage(fileName); | |
− | + | // },100) | |
− | + | }, | |
− | + | error:function(xhr,status, error){ | |
− | + | console.log(error) | |
− | + | reject(error) | |
− | + | } | |
− | + | }); | |
− | + | }); | |
} | } | ||
function createPreviews(filesSelected){ | function createPreviews(filesSelected){ | ||
− | + | if (filesSelected.length > 0) { | |
− | + | ||
for(i = 0; i < filesSelected.length; ++i){ | for(i = 0; i < filesSelected.length; ++i){ | ||
− | + | ||
var fileToLoad = filesSelected[i]; | var fileToLoad = filesSelected[i]; | ||
var fname = fileToLoad.name; | var fname = fileToLoad.name; | ||
if(fname.substr( fname.length -3 ) === "pdf"){ | if(fname.substr( fname.length -3 ) === "pdf"){ | ||
− | + | ||
//add somthing here | //add somthing here | ||
}else{ | }else{ | ||
− | + | ||
var fileReader = new FileReader(); | var fileReader = new FileReader(); | ||
− | + | ||
fileReader.onload = function(fileLoadedEvent) { | fileReader.onload = function(fileLoadedEvent) { | ||
− | + | var srcData = fileLoadedEvent.target.result; // <--- data: base64 | |
− | + | ||
− | + | var newImage = document.createElement('img'); | |
− | + | newImage.src = srcData; | |
− | + | var dt = filesSelected[counter] | |
− | + | counter = counter + 1; | |
− | + | ||
if(settingsCaption){ | if(settingsCaption){ | ||
− | + | document.getElementById("widget-file-upload-preview").innerHTML = document.getElementById("widget-file-upload-preview").innerHTML+'<div class="upload-group">'+newImage.outerHTML+'<input data="'+dt.name+'" type="text" placeholder="caption" class="form-control" /></div>'; | |
− | + | ||
− | + | }else{ | |
− | + | document.getElementById("widget-file-upload-preview").innerHTML = document.getElementById("widget-file-upload-preview").innerHTML+'<div class="upload-group">'+newImage.outerHTML+'</div>'; | |
− | + | } | |
} | } | ||
− | + | ||
− | + | fileReader.readAsDataURL(fileToLoad); | |
} | } | ||
− | + | } | |
− | + | } | |
} | } | ||
function editFilePage(file){ | function editFilePage(file){ | ||
− | + | ||
− | + | if(settingsCaption){ | |
var caption = document.querySelector('[data="'+file+'"]').value; | var caption = document.querySelector('[data="'+file+'"]').value; | ||
var newWikitextEdit = createWikitext(file, caption); | var newWikitextEdit = createWikitext(file, caption); | ||
− | + | }else{ | |
var newWikitextEdit = createWikitext(file); | var newWikitextEdit = createWikitext(file); | ||
− | + | } | |
− | + | ||
− | + | var params = { | |
− | + | action: 'edit', | |
− | + | title: 'File:'+createFilename(file), | |
− | + | text: newWikitextEdit, | |
− | + | format: 'json' | |
− | + | }, | |
− | + | api = new mw.Api(); | |
− | + | ||
− | + | api.postWithToken( 'csrf', params ).done( function ( data ) { | |
− | + | console.log( data ); | |
− | + | } ); | |
− | + | ||
} | } | ||
Regel 252: | Regel 241: | ||
if(dropArea){ | if(dropArea){ | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | ;['dragenter', 'dragover', 'dragleave', 'drop'].forEach(function(eventName){ | ||
+ | dropArea.addEventListener(eventName, preventDefaults, false) | ||
+ | }) | ||
+ | |||
+ | function preventDefaults (e) { | ||
+ | e.preventDefault() | ||
+ | e.stopPropagation() | ||
+ | } | ||
+ | |||
+ | ;['dragenter', 'dragover'].forEach(eventName => { | ||
+ | dropArea.addEventListener(eventName, highlight, false) | ||
+ | }) | ||
+ | |||
+ | ;['dragleave', 'drop'].forEach(eventName => { | ||
+ | dropArea.addEventListener(eventName, unhighlight, false) | ||
+ | }) | ||
+ | |||
+ | function highlight(e) { | ||
+ | dropArea.classList.add('highlight') | ||
+ | } | ||
+ | |||
+ | function unhighlight(e) { | ||
+ | dropArea.classList.remove('highlight') | ||
+ | } | ||
+ | |||
+ | dropArea.addEventListener('drop', handleDrop, false) | ||
− | fileInput.closest('form').querySelector('[type="submit"]').addEventListener('click', uploadFiles, false) | + | function handleDrop(e) { |
− | } | + | var dt = e.dataTransfer |
+ | var files = dt.files | ||
+ | dropped = files; | ||
+ | |||
+ | if(settingsPreview != "false"){ | ||
+ | createPreviews(files); | ||
+ | } | ||
+ | |||
+ | fileInput.closest('form').querySelector('[type="submit"]').addEventListener('click', uploadFiles, false) | ||
+ | } | ||
} | } |
Versie van 7 sep 2020 10:44
This is the Widget:File upload page. It should be called in the following format:
{{#widget:File upload |multiple=false |preview=true |caption=true |drop=false |button={{fa|upload}} |filepagetemplate=file for test |filepageparameters=filename:<FILENAME><Title>;page:{{FULLPAGENAME}} |filename=<FILENAME><Title> }}