You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

177 lines
4.3 KiB
CoffeeScript

$ = require "jquery"
prettyUnits = require "pretty-units"
# The AMD loader for this package doesn't work for some reason - so we explicitly disable it. This will force it to fall back to the CommonJS API.
require "imports?define=>false!blueimp-file-upload"
data_object = null
uploadDone = (response) ->
switch response.status
when 415
errorHeader = "Oops! That's not a PDF file."
errorMessage = "The file you tried to upload is not a valid PDF file. Currently, only PDF files are accepted."
when 413
errorHeader = "Oops! That file is too big."
errorMessage = "The file you tried to upload is too big. Currently, you can only upload PDF files up to 150MB in size."
when 200 # Nothing, success!
else
errorHeader = "Oops! Something went wrong."
errorMessage = "An unknown error occurred. Please reload the page and try again. If the error keeps occurring, <a href='mailto:pdfy@cryto.net'>send us an e-mail</a>!"
if errorMessage?
triggerError errorHeader, errorMessage
reinitializeUploader()
else
if response.responseJSON.redirect?
window.location = response.responseJSON.redirect
else
# TODO: Wat do?
triggerError = (header, message) ->
$(".upload-form .privacySettings, .upload-form .progress, .upload-form .button-submit").hide()
$(".upload").removeClass("faded")
errorBox = $("#uploadError")
.show()
errorBox.find "h3"
.html header
errorBox.find ".message"
.html message
data_object = null
reinitializeUploader = ->
$("#upload_element").replaceWith($("#upload_element").clone(true))
filePicked = (data) ->
$(".upload-form .privacySettings, .upload-form .button-submit").show()
$("#uploadError").hide()
$(".upload-form .fileinfo").removeClass("faded")
fileinfo = $(".fileinfo")
filesize = data.files[0].size
# TODO: Use filesize limit from configuration file!
if filesize > (150 * 1024 * 1024)
reinitializeUploader()
triggerError("Oops! That file is too big.", "The file you tried to upload is too big. Currently, you can only upload PDF files up to 150MB in size.")
return
filesize_text = prettyUnits(filesize) + "B"
fileinfo.find ".filename"
.text data.files[0].name
fileinfo.find ".filesize"
.text filesize_text
$ ".info"
.hide()
fileinfo
.show()
$ ".upload"
.addClass "faded"
updateUploadProgress = (event) ->
if event.lengthComputable
percentage = event.loaded / event.total * 100
done_text = prettyUnits(event.loaded) + "B"
total_text = prettyUnits(event.total) + "B"
progress = $ ".progress"
progress.find ".done"
.text done_text
progress.find ".total"
.text total_text
progress.find ".percentage"
.text (Math.ceil(percentage * 100) / 100)
progress.find ".bar-inner"
.css width: "#{percentage}%"
if event.loaded >= event.total
# Completed!
progress.find ".numbers"
.hide()
progress.find ".wait"
.show()
$ ->
if $().fileupload?
# Only run this if the fileupload plugin is loaded; we don't need all this on eg. the 'view' page.
$ "#upload_form"
.fileupload
fileInput: null
type: "POST"
url: "/upload"
paramName: "file"
autoUpload: false
maxNumberOfFiles: 1
formData: (form) ->
form = $ "#upload_form"
form.serializeArray()
progressall: (e, data) ->
updateUploadProgress
lengthComputable: true
loaded: data.loaded
total: data.total
add: (e, data) ->
data_object = data
filePicked(data)
always: (e, data) ->
uploadDone(data.jqXHR)
$ "#upload_activator"
.on "click", (event) ->
$("#upload_element").click()
$ "#upload_element"
.on "change", (event) ->
filePicked(this)
$ "#upload_form"
.on "submit", (event) ->
event.stopPropagation()
event.preventDefault()
$ ".fileinfo"
.addClass "faded"
$ ".progress"
.show()
if data_object == null
# Only do this if the drag-and-drop dropzone hasn't been used.
formData = new FormData(this)
$.ajax
method: "POST"
url: "/upload"
data: formData
cache: false
contentType: false
processData: false
xhr: ->
customHandler = $.ajaxSettings.xhr()
if customHandler.upload?
customHandler.upload.addEventListener "progress", updateUploadProgress, false
return customHandler
complete: (result) ->
uploadDone(result)
else
# If the dropzone was used...
data_object.submit()