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();