<style> .dz-default { display: none; } .dz-preview { display: none; } .dz-processing { display: none; } .dz-error { display: none; } .dz-image-preview { display: none; } </style> <div class="header-Outro with-site-image dashboard"> <div class="row content wide"> <div class="col col-50 signup-Area"> <div class="signup-Form"> <fieldset class="content"> <a href="<%= current_site.uri %>" class="screenshot dashboard" style="background-image:url(<%= current_site.screenshot_url('index.html', '540x405') %>);"></a> </fieldset> </div> </div> <div class="col col-50"> <h2 class="eps"><%= current_site.title %></h2> <p class="site-url"> <a href="<%= current_site.uri %>" target="_blank"><%= current_site.host %></a> <a href="#" id="shareButton" class="btn-Action" data-container="body" data-toggle="popover" data-placement="bottom" data-content='<%== erb :'_share', layout: false, locals: {site: current_site} %>'><i class="fa fa-share-alt"></i> <span>Share</span></a> </p> <ul> <% if current_site.site_updated_at %> <li>Last updated <%= current_site.site_updated_at.ago.downcase %></li> <% end %> <li>Using <strong><%= current_site.space_percentage_used %>% (<%= current_site.total_space_used.to_space_pretty %>) of your <%= current_site.maximum_space.to_space_pretty %></strong>. <br> <% unless current_site.is_education || current_site.supporter? %>Need more space? <a href="/supporter">Become a Supporter!</a><% end %></li> <li><strong><%= current_site.views.format_large_number %></strong> views</li> </ul> </div> </div> <!-- end .row --> </div> <!-- end .header-Outro --> <main class="content-Base" role="main"> <div class="content wide"> <% unless current_site.changed_count >= 1 %> <div class="welcome"> <!-- <div class="close-button"></div> --> <h4>Hello! Welcome to your new site.</h4> To get started, click on the <strong>index.html</strong> file below to edit your home page. Once you make changes your website will begin appearing in our <a href="/browse">website gallery</a>. You can add more files (such as images) by dragging them from your computer into the box below. Need help building web sites? Try our <a href="/tutorial/html/">HTML tutorial</a>! </div> <% end %> <%== flash_display %> <div id="filesDisplay" class="files"> <script> if(localStorage && localStorage.getItem('viewType') == 'list') $('#filesDisplay').addClass('list-view') </script> <div id="uploadingOverlay" class="uploading-overlay" style="display: none"> <div class="uploading"> <p>Uploading, please wait...</p> <div id="progressBar" class="progress-bar" style="display: none"><div id="uploadingProgress" class="progress" style="width: 0%"></div></div> </div> </div> <div id="movingOverlay" class="uploading-overlay" style="display: none"> <div class="uploading"> <p>Moving file, please wait...</p> </div> </div> <div class="header"> <div class="btn-group" role="group" aria-label="..."> <button type="button" class="btn btn-default iconview-button" title="Icon View" onclick="iconView()"><i class="fa fa-th"></i></button> <button type="button" class="btn btn-default listview-button" title="List View" onclick="listView()"><i class="fa fa-list"></i></button> </div> <div class="breadcrumbs"> <% if params[:dir].nil? || params[:dir].empty? || params[:dir] == '/' %> Home <% else %> <a href="/dashboard">Home</a> <% end %> <% if @dir %> <% dir_array = @dir.split '/' %> <% dir_array.each_with_index do |dir,i| %> <% if i+1 < dir_array.length %> <a href="/dashboard?dir=<%= Rack::Utils.escape dir_array[1..i].join('/') %>"><%= dir %></a> <i class="fa fa-angle-right"></i> <% else %> <%= dir %> <% end %> <% end %> <% end %> </div> <div class="actions"> <a href="#createFile" class="btn-Action" data-toggle="modal"><i class="fa fa-file"></i> New File</a> <a href="#createDir" class="btn-Action" data-toggle="modal"><i class="fa fa-folder"></i> New Folder</a> <a href="#" class="btn-Action" onclick="clickUploadFiles(); return false"><i class="fa fa-arrow-circle-up"></i> Upload</a> </div> </div> <div class="list"> <form action="/site_files/upload" class="dropzone" id="uploads"> <div class="dz-message" style="display: none"></div> <input name="csrf_token" type="hidden" value="<%= csrf_token %>"> <input name="dir" type="hidden" value="<%= @dir %>"> <div class="upload-Boundary <%= @file_list.length <= 5 ? 'with-instruction' : '' %>"> <% @file_list.each do |file| %> <div class="file filehover"> <% if file[:is_html] && current_site.screenshot_exists?(file[:path], '210x158') %> <div class="html-thumbnail html fileimagehover"> <img src="<%= current_site.screenshot_url(file[:path], '210x158') %>" alt=""> <div class="overlay"></div> </div> <% elsif file[:is_image] && current_site.thumbnail_exists?(file[:path], '210x158') %> <div class="html-thumbnail image fileimagehover"> <img src="<%= current_site.thumbnail_url(file[:path], '210x158') %>" alt=""> <div class="overlay"></div> </div> <% elsif file[:is_directory] %> <div class="html-thumbnail folder fileimagehover" ondrop="moveFileToFolder(event)"> <div class="folder-icon"></div> <div class="overlay"></div> </div> <% else %> <div class="html-thumbnail misc fileimagehover"> <div class="misc-icon"><%= file[:ext][0..3] %></div> <div class="overlay"></div> </div> <% end %> <a class="title"> <%= file[:name] %> </a> <div class="column size"> <% if file[:size] %> <%= file[:size].to_bytes_pretty %> <% end %> </div> <div class="column updated"> <% if file[:updated_at] %> <%= file[:updated_at].ago %> <% end %> </div> <div class="overlay"> <div id="<%= Digest::SHA256.hexdigest file[:path] %>" style="display: none"><%= file[:path] %></div> <% if file[:is_editable] %> <a href="/site_files/text_editor/<%= file[:path] %>"><i class="fa fa-edit" title="Edit"></i> Edit</a> <% end %> <% if file[:is_directory] %> <a href="?dir=<%= Rack::Utils.escape file[:path] %>"><i class="fa fa-edit" title="Manage"></i> Manage</a> <% end %> <% if !file[:is_root_index] %> <a href="#" onclick="confirmFileRename($('#<%= Digest::SHA256.hexdigest file[:path] %>').text())"><i class="fa fa-file" title="Rename"></i> Rename</a> <a href="#" onclick="confirmFileDelete($('#<%= Digest::SHA256.hexdigest file[:path] %>').text())"><i class="fa fa-trash" title="Delete"></i> Delete</a> <% end %> <% if file[:is_directory] %> <a class="link-overlay" href="?dir=<%= Rack::Utils.escape file[:path] %>" title="View <%= file[:path] %>"></a> <% else %> <a class="link-overlay" href="<%= current_site.file_uri file[:path] %>" title="View <%= file[:path] == '/index.html' ? 'your site index' : file[:path] %>" target="_blank"></a> <% end %> </div> </div> <% end %> </div> </form> </div> </div> <form method="POST" action="/site_files/delete" id="deleteFilenameForm"> <input name="csrf_token" type="hidden" value="<%= csrf_token %>"> <input type="hidden" id="deleteFilenameInput" name="filename"> </form> <div class="modal hide fade" id="deleteConfirmModal" tabindex="-1" role="dialog" aria-labelledby="deleteConfirmModalLabel" aria-hidden="true"> <div class="modal-header"> <button class="close" type="button" data-dismiss="modal" aria-hidden="true"><i class="fa fa-times"></i></button> <h3 id="deleteConfirmModalLabel">Confirm deletion</h3> </div> <div class="modal-body"> <p>You are about to delete <strong><span id="deleteFileName"></span></strong>. Are you sure?</p> </div> <div class="modal-footer"> <button class="btn cancel" data-dismiss="modal" aria-hidden="true" type="button">Cancel</button> <button class="btn-Action btn-danger" type="button" onclick="fileDelete()"><i class="fa fa-trash" title="Delete"></i>Delete</button> </div> </div> <div class="modal hide fade" id="renameModal" tabindex="-1" role="dialog" aria-labelledby="renameModalLabel" aria-hidden="true"> <form method="post" action="/site_files/rename"> <input type="hidden" value="<%= csrf_token %>" name="csrf_token"> <input type="hidden" value="<%= @dir %>" name="dir"> <input type="hidden" id="renamePathInput" name="path"> <div class="modal-header"> <button class="close" type="button" data-dismiss="modal" aria-hidden="true"><i class="fa fa-times"></i></button> <h3 id="renameModalLabel">Rename / Move</h3> </div> <div class="modal-body"> <input id="renameNewPathInput" name="new_path" type="text"> <p>Note: We will automatically scrub any characters not matching: a-z A-Z 0-9 _ - .</p> </div> <div class="modal-footer"> <button type="button" class="btn cancel" data-dismiss="modal" aria-hidden="true">Cancel</button> <button type="submit" class="btn-Action">Rename</button> </div> </form> </div> <div class="site-actions" style="margin-bottom:25px"> <% if !current_site.plan_feature(:no_file_restrictions) %> <a href="/site_files/allowed_types">Allowed file types</a> | <% end %> <% unless current_site.too_big_to_download? %> <a href="/site_files/<%= current_site.username %>.zip">Download entire site</a> | <% end %> <% unless is_education? %> <a href="/site_files/mount_info">Mount your site as a drive on your computer</a> <% end %> </div> </div> </main> <form id="uploadFilesButtonForm" method="POST" action="/site_files/upload" enctype="multipart/form-data" style="display: none" onsubmit="showUploadProgress()"> <input name="csrf_token" type="hidden" value="<%= csrf_token %>"> <input name="from_button" type="hidden" value="true"> <input name="dir" type="hidden" value="<%= @dir %>"> <input id="uploadFiles" type="file" name="files[]" multiple onchange="$('#uploadFilesButtonForm').submit()"> </form> <div class="modal hide fade" id="createDir" tabindex="-1" role="dialog" aria-labelledby="createDirLabel" aria-hidden="true"> <form method="post" action="/site/create_directory"> <input type="hidden" value="<%= csrf_token %>" name="csrf_token"> <input type="hidden" value="<%= @dir %>" name="dir"> <div class="modal-header"> <button class="close" type="button" data-dismiss="modal" aria-hidden="true"><i class="fa fa-times"></i></button> <h3 id="createDirLabel">Create Folder</h3> </div> <div class="modal-body"> <input id="newDirInput" name="name" type="text" placeholder="folder_name"> </div> <div class="modal-footer"> <button type="button" class="btn cancel" data-dismiss="modal" aria-hidden="true">Cancel</button> <button type="submit" class="btn-Action">Create</button> </div> </form> </div> <div class="modal hide fade" id="createFile" tabindex="-1" role="dialog" aria-labelledby="createFileLabel" aria-hidden="true"> <form method="post" action="/site_files/create"> <input type="hidden" value="<%= csrf_token %>" name="csrf_token"> <input type="hidden" value="<%= @dir %>" name="dir"> <div class="modal-header"> <button class="close" type="button" data-dismiss="modal" aria-hidden="true"><i class="fa fa-times"></i></button> <h3 id="createFileLabel">Create New File</h3> </div> <div class="modal-body"> <input id="newFileInput" name="filename" type="text" placeholder="newfile.html"> <p>Note: We will automatically scrub any characters not matching: a-z A-Z 0-9 _ - .</p> </div> <div class="modal-footer"> <button type="button" class="btn cancel" data-dismiss="modal" aria-hidden="true">Cancel</button> <button type="submit" class="btn-Action">Create</button> </div> </form> </div> <script src="/js/dropzone.min.js"></script> <script> 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) { console.log(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') } allUploadsComplete = false Dropzone.options.uploads = { paramName: 'files', maxFilesize: <%= current_site.remaining_space.to_mb %>, clickable: false, addRemoveLinks: false, dictDefaultMessage: '', uploadMultiple: true, init: function() { this.on("completemultiple", function(file) { if(allUploadsComplete == true) location.reload() }) this.on("error", function(file, errorMessage) { hideUploadProgress() // Guess a directory upload error if(file.status == 'error' && file.name.match(/.+\..+/) == null && errorMessage == 'Server responded with 0 code.') { alert('Recursive directory upload is only supported by the Chrome web browser.') } else { location.href = '/dashboard<%= @dir ? "?dir=#{Rack::Utils.escape @dir}" : "" %>' } }) this.on("totaluploadprogress", function(progress, totalBytes, totalBytesSent) { if(progress == 100) allUploadsComplete = true showUploadProgress() $('#progressBar').css('display', 'block') $('#uploadingProgress').css('width', progress+'%') }) this.on("sending", function(file) { if(file.fullPath !== undefined) $('#uploads').append('<input type="hidden" name="file_paths[]" value="'+file.fullPath+'">') }) } } $('#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') } </script>