Files
grecia/app/assets/javascripts/documentable.js.coffee
Javi Martín cc7e0d586b Reduce local variables usage in CoffeeScript
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.
2019-09-11 03:14:17 +02:00

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