mirror of
https://github.com/neocities/neocities.git
synced 2025-04-24 17:22:35 +02:00
249 lines
6.7 KiB
JavaScript
249 lines
6.7 KiB
JavaScript
if(localStorage && localStorage.getItem('viewType') == 'list')
|
|
$('#filesDisplay').addClass('list-view')
|
|
|
|
function uploadFileFromButton() {
|
|
var form = $('#uploadFilesButtonForm')[0];
|
|
var dirValue = $('#dir').val();
|
|
var formData = new FormData();
|
|
|
|
// Append other form data
|
|
formData.append('csrf_token', $(form).find('input[name="csrf_token"]').val());
|
|
formData.append('from_button', $(form).find('input[name="from_button"]').val());
|
|
formData.append('dir', dirValue);
|
|
|
|
uploadFilesCount = 0
|
|
// Append files with modified filenames
|
|
$.each($('#uploadFiles')[0].files, function(i, file) {
|
|
var modifiedFileName = dirValue + '/' + file.name;
|
|
formData.append(modifiedFileName, file);
|
|
uploadFilesCount++;
|
|
});
|
|
|
|
alertClear();
|
|
|
|
$.ajax({
|
|
url: '/api/upload',
|
|
type: 'POST',
|
|
data: formData,
|
|
contentType: false, // This is required for FormData
|
|
processData: false, // This is required for FormData
|
|
success: function(data) {
|
|
alertType('success');
|
|
alertAdd(uploadFilesCount+' files uploaded successfully.');
|
|
reloadDashboardFiles();
|
|
},
|
|
error: function(xhr, status, error) {
|
|
var responseBody = JSON.parse(xhr.responseText);
|
|
alertType('error');
|
|
alertAdd(responseBody.message);
|
|
reloadDashboardFiles();
|
|
}
|
|
});
|
|
}
|
|
|
|
$('#uploadFiles').change(function() {
|
|
$('#uploadFilesButtonForm').submit();
|
|
});
|
|
|
|
var uploadForm = $('#uploadFilesButtonForm')[0];
|
|
var deleteForm = $('#deleteFilenameForm')[0];
|
|
|
|
function moveFileToFolder(event) {
|
|
var link = event.dataTransfer.getData("Text");
|
|
if(link) link = link.trim();
|
|
if(!link || link.startsWith('https://neocities.org/dashboard')) return;
|
|
event.preventDefault();
|
|
var name = link.split('.neocities.org/').slice(1).join('.neocities.org/');
|
|
var oReq = new XMLHttpRequest();
|
|
oReq.open("GET", "/site_files/download/" + name, true);
|
|
oReq.responseType = "arraybuffer";
|
|
|
|
$('#movingOverlay').css('display', 'block')
|
|
|
|
oReq.onload = function() {
|
|
var newFile = new File([oReq.response], name);
|
|
var dataTransfer = new DataTransfer();
|
|
var currentFolder = new URL(location.href).searchParams.get('dir');
|
|
if(!currentFolder) currentFolder = '';
|
|
else currentFolder = currentFolder + '/';
|
|
|
|
dataTransfer.items.add(newFile);
|
|
$('#uploadFilesButtonForm > input[name="dir"]')[0].value = currentFolder + event.target.parentElement.parentElement.getElementsByClassName('title')[0].innerText.trim();
|
|
$('#uploadFiles')[0].files = dataTransfer.files;
|
|
$.ajax({
|
|
type: uploadForm.method,
|
|
url: uploadForm.action,
|
|
data: new FormData(uploadForm),
|
|
processData: false,
|
|
contentType: false,
|
|
success: function() {
|
|
let csrf = $('#uploadFilesButtonForm > input[name="csrf_token"]')[0].value;
|
|
var dReq = new XMLHttpRequest();
|
|
dReq.open(deleteForm.method, deleteForm.action, true);
|
|
dReq.onload = function() {
|
|
location.reload()
|
|
}
|
|
dReq.setRequestHeader("content-type", 'application/x-www-form-urlencoded');
|
|
dReq.send("csrf_token=" + encodeURIComponent(csrf) + "&filename=" + name.replace(/\s/g, '+'));
|
|
},
|
|
error: function() {
|
|
location.reload()
|
|
}
|
|
});
|
|
};
|
|
oReq.send();
|
|
}
|
|
|
|
function confirmFileRename(path) {
|
|
$('#renamePathInput').val(path);
|
|
$('#renameNewPathInput').val(path);
|
|
$('#renameModal').modal();
|
|
}
|
|
|
|
function confirmFileDelete(name) {
|
|
$('#deleteFileName').text(name);
|
|
$('#deleteConfirmModal').modal();
|
|
}
|
|
|
|
function fileDelete() {
|
|
$('#deleteFilenameInput').val($('#deleteFileName').html());
|
|
$('#deleteFilenameForm').submit();
|
|
}
|
|
|
|
function clickUploadFiles() {
|
|
$("input[id='uploadFiles']").click()
|
|
}
|
|
|
|
function showUploadProgress() {
|
|
$('#uploadingOverlay').css('display', 'block')
|
|
}
|
|
|
|
function hideUploadProgress() {
|
|
$('#progressBar').css('display', 'none')
|
|
$('#uploadingOverlay').css('display', 'none')
|
|
}
|
|
|
|
$('#createDir').on('shown', function () {
|
|
$('#newDirInput').focus();
|
|
})
|
|
|
|
$('#createFile').on('shown', function () {
|
|
$('#newFileInput').focus();
|
|
})
|
|
|
|
function listView() {
|
|
if(localStorage)
|
|
localStorage.setItem('viewType', 'list')
|
|
|
|
$('#filesDisplay').addClass('list-view')
|
|
}
|
|
|
|
function iconView() {
|
|
if(localStorage)
|
|
localStorage.removeItem('viewType')
|
|
|
|
$('#filesDisplay').removeClass('list-view')
|
|
}
|
|
|
|
function alertAdd(text) {
|
|
var a = $('#alertDialogue');
|
|
a.css('display', 'block');
|
|
a.append(text+'<br>');
|
|
}
|
|
|
|
function alertClear(){
|
|
var a = $('#alertDialogue');
|
|
a.css('display', 'none');
|
|
a.text('');
|
|
}
|
|
|
|
function alertType(type){
|
|
var a = $('#alertDialogue');
|
|
a.removeClass('alert-success');
|
|
a.removeClass('alert-error');
|
|
a.addClass('alert-'+type);
|
|
}
|
|
|
|
var processedFiles = 0;
|
|
var uploadedFiles = 0;
|
|
var uploadedFileErrors = 0;
|
|
|
|
function joinPaths(...paths) {
|
|
return paths
|
|
.map(path => path.replace(/(^\/|\/$)/g, ''))
|
|
.filter(path => path !== '')
|
|
.join('/');
|
|
}
|
|
|
|
function reInitDashboardFiles() {
|
|
new Dropzone("#uploads", {
|
|
url: "/api/upload",
|
|
paramName: 'file',
|
|
dictDefaultMessage: "",
|
|
uploadMultiple: false,
|
|
parallelUploads: 1,
|
|
maxFilesize: 104857600, // 100MB
|
|
clickable: false,
|
|
|
|
init: function() {
|
|
this.on("processing", function(file) {
|
|
var dir = $('#uploads input[name="dir"]').val();
|
|
if(file.fullPath) {
|
|
this.options.paramName = joinPaths(dir,file.fullPath);
|
|
} else {
|
|
this.options.paramName = joinPaths(dir, file.name);
|
|
}
|
|
|
|
processedFiles++;
|
|
$('#uploadFileName').text(this.options.paramName).prepend('<i class="icon-file"></i> ');
|
|
});
|
|
|
|
this.on("success", function(file) {
|
|
uploadedFiles++;
|
|
});
|
|
|
|
this.on("error", function(file, message) {
|
|
uploadedFiles++;
|
|
uploadedFileErrors++;
|
|
alertType('error');
|
|
if (message && message.message) {
|
|
alertAdd(message.message);
|
|
} else {
|
|
alertAdd(this.options.paramName+' failed to upload');
|
|
}
|
|
});
|
|
|
|
this.on("queuecomplete", function() {
|
|
hideUploadProgress();
|
|
if(uploadedFileErrors > 0) {
|
|
alertType('error');
|
|
alertAdd(uploadedFiles-uploadedFileErrors+'/'+uploadedFiles+' files uploaded successfully');
|
|
} else {
|
|
alertType('success');
|
|
alertAdd(uploadedFiles+' files uploaded successfully');
|
|
}
|
|
reloadDashboardFiles();
|
|
});
|
|
|
|
this.on("addedfiles", function(files) {
|
|
uploadedFiles = 0;
|
|
uploadedFileErrors = 0;
|
|
alertClear();
|
|
showUploadProgress();
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
function reloadDashboardFiles() {
|
|
$.get('/dashboard/files?dir='+encodeURIComponent($("#dir").val()), function(data) {
|
|
$('#filesDisplay').html(data);
|
|
reInitDashboardFiles();
|
|
});
|
|
}
|
|
|
|
// for first time load
|
|
reInitDashboardFiles();
|
|
|
|
|
|
|