Local variables are one of the things CoffeeScript doesn't compile to modern JavaScript automatically: it uses `var` instead of `const` or `let`. Besides, using `$this = $(this)` is usually done to reference the current object in another function where the current object is a different one. Here we were using it with no clear purpose.
157 lines
5.8 KiB
CoffeeScript
157 lines
5.8 KiB
CoffeeScript
"use strict"
|
|
|
|
App.Documentable =
|
|
|
|
initialize: ->
|
|
$(".js-document-attachment").each ->
|
|
App.Documentable.initializeDirectUploadInput(this)
|
|
|
|
$("#nested-documents").on "cocoon:after-remove", ->
|
|
App.Documentable.unlockUploads()
|
|
|
|
$("#nested-documents").on "cocoon:after-insert", (e, nested_document) ->
|
|
input = $(nested_document).find(".js-document-attachment")
|
|
input["lockUpload"] = $(nested_document).closest("#nested-documents").find(".document:visible").length >= $("#nested-documents").data("max-documents-allowed")
|
|
App.Documentable.initializeDirectUploadInput(input)
|
|
App.Documentable.lockUploads() if input["lockUpload"]
|
|
|
|
initializeDirectUploadInput: (input) ->
|
|
|
|
inputData = this.buildData([], input)
|
|
|
|
this.initializeRemoveCachedDocumentLink(input, inputData)
|
|
|
|
$(input).fileupload
|
|
|
|
paramName: "attachment"
|
|
|
|
formData: null
|
|
|
|
add: (e, data) ->
|
|
upload_data = App.Documentable.buildData(data, e.target)
|
|
App.Documentable.clearProgressBar(upload_data)
|
|
App.Documentable.setProgressBar(upload_data, "uploading")
|
|
upload_data.submit()
|
|
|
|
change: (e, data) ->
|
|
data.files.forEach (file) ->
|
|
App.Documentable.setFilename(inputData, file.name)
|
|
|
|
fail: (e, data) ->
|
|
$(data.cachedAttachmentField).val("")
|
|
App.Documentable.clearFilename(data)
|
|
App.Documentable.setProgressBar(data, "errors")
|
|
App.Documentable.clearInputErrors(data)
|
|
App.Documentable.setInputErrors(data)
|
|
$(data.destroyAttachmentLinkContainer).find("a.delete:not(.remove-nested)").remove()
|
|
$(data.addAttachmentLabel).addClass("error")
|
|
$(data.addAttachmentLabel).show()
|
|
|
|
done: (e, data) ->
|
|
$(data.cachedAttachmentField).val(data.result.cached_attachment)
|
|
App.Documentable.setTitleFromFile(data, data.result.filename)
|
|
App.Documentable.setProgressBar(data, "complete")
|
|
App.Documentable.setFilename(data, data.result.filename)
|
|
App.Documentable.clearInputErrors(data)
|
|
$(data.addAttachmentLabel).hide()
|
|
$(data.wrapper).find(".attachment-actions").removeClass("small-12").addClass("small-6 float-right")
|
|
$(data.wrapper).find(".attachment-actions .action-remove").removeClass("small-3").addClass("small-12")
|
|
|
|
destroyAttachmentLink = $(data.result.destroy_link)
|
|
$(data.destroyAttachmentLinkContainer).html(destroyAttachmentLink)
|
|
$(destroyAttachmentLink).on "click", (e) ->
|
|
e.preventDefault()
|
|
e.stopPropagation()
|
|
App.Documentable.doDeleteCachedAttachmentRequest(this.href, data)
|
|
|
|
App.Documentable.showNotice() if input["lockUpload"]
|
|
|
|
|
|
progress: (e, data) ->
|
|
progress = parseInt(data.loaded / data.total * 100, 10)
|
|
$(data.progressBar).find(".loading-bar").css "width", "#{progress}%"
|
|
return
|
|
|
|
buildData: (data, input) ->
|
|
wrapper = $(input).closest(".direct-upload")
|
|
data.input = input
|
|
data.wrapper = wrapper
|
|
data.progressBar = $(wrapper).find(".progress-bar-placeholder")
|
|
data.errorContainer = $(wrapper).find(".attachment-errors")
|
|
data.fileNameContainer = $(wrapper).find("p.file-name")
|
|
data.destroyAttachmentLinkContainer = $(wrapper).find(".action-remove")
|
|
data.addAttachmentLabel = $(wrapper).find(".action-add label")
|
|
data.cachedAttachmentField = $(wrapper).find("input[name$='[cached_attachment]']")
|
|
data.titleField = $(wrapper).find("input[name$='[title]']")
|
|
$(wrapper).find(".progress-bar-placeholder").css("display", "block")
|
|
return data
|
|
|
|
clearFilename: (data) ->
|
|
$(data.fileNameContainer).text("")
|
|
$(data.fileNameContainer).hide()
|
|
|
|
clearInputErrors: (data) ->
|
|
$(data.errorContainer).find("small.error").remove()
|
|
|
|
clearProgressBar: (data) ->
|
|
$(data.progressBar).find(".loading-bar").removeClass("complete errors uploading").css("width", "0px")
|
|
|
|
setFilename: (data, file_name) ->
|
|
$(data.fileNameContainer).text(file_name)
|
|
$(data.fileNameContainer).show()
|
|
|
|
setProgressBar: (data, klass) ->
|
|
$(data.progressBar).find(".loading-bar").addClass(klass)
|
|
|
|
setTitleFromFile: (data, title) ->
|
|
if $(data.titleField).val() == ""
|
|
$(data.titleField).val(title)
|
|
|
|
setInputErrors: (data) ->
|
|
errors = "<small class='error'>#{data.jqXHR.responseJSON.errors}</small>"
|
|
$(data.errorContainer).append(errors)
|
|
|
|
lockUploads: ->
|
|
$("#new_document_link").addClass("hide")
|
|
|
|
unlockUploads: ->
|
|
$("#max-documents-notice").addClass("hide")
|
|
$("#new_document_link").removeClass("hide")
|
|
|
|
showNotice: ->
|
|
$("#max-documents-notice").removeClass("hide")
|
|
|
|
doDeleteCachedAttachmentRequest: (url, data) ->
|
|
$.ajax
|
|
type: "POST"
|
|
url: url
|
|
dataType: "json"
|
|
data: { "_method": "delete" }
|
|
complete: ->
|
|
$(data.cachedAttachmentField).val("")
|
|
$(data.addAttachmentLabel).show()
|
|
|
|
App.Documentable.clearFilename(data)
|
|
App.Documentable.clearInputErrors(data)
|
|
App.Documentable.clearProgressBar(data)
|
|
|
|
App.Documentable.unlockUploads()
|
|
$(data.wrapper).find(".attachment-actions").addClass("small-12").removeClass("small-6 float-right")
|
|
$(data.wrapper).find(".attachment-actions .action-remove").addClass("small-3").removeClass("small-12")
|
|
|
|
if $(data.input).data("nested-document") == true
|
|
$(data.wrapper).remove()
|
|
else
|
|
$(data.wrapper).find("a.remove-cached-attachment").remove()
|
|
|
|
initializeRemoveCachedDocumentLink: (input, data) ->
|
|
wrapper = $(input).closest(".direct-upload")
|
|
remove_document_link = $(wrapper).find("a.remove-cached-attachment")
|
|
$(remove_document_link).on "click", (e) ->
|
|
e.preventDefault()
|
|
e.stopPropagation()
|
|
App.Documentable.doDeleteCachedAttachmentRequest(this.href, data)
|
|
|
|
removeDocument: (id) ->
|
|
$("##{id}").remove()
|