jam-cloud/web/app/assets/javascripts/react-components/stores/AttachmentStore.js.coffee

210 lines
6.3 KiB
CoffeeScript

$ = jQuery
context = window
logger = context.JK.logger
rest = context.JK.Rest()
AttachmentActions = @AttachmentActions
@AttachmentStore = Reflux.createStore(
{
listenables: AttachmentActions
lessonId: null
uploading: false
init: ->
# Register with the app store to get @app
this.listenTo(context.AppStore, this.onAppInit)
onAppInit: (@app) ->
@ui = new context.JK.UIHelper(@app);
recordingsSelected: (recordings) ->
logger.debug("recording selected", recordings)
options = {id: @lessonId}
options.recordings = recordings
rest.attachRecordingToLesson(options).done((response) => @attachedRecordingsToLesson(response)).fail((jqXHR) => @attachedRecordingsFail(jqXHR))
attachedRecordingsToLesson: (response) ->
context.JK.Banner.showNotice('Recording Attached', 'Your recording has been associated with this lesson, and can be accessed from the Messages window for this lesson.')
attachedRecordingsFail: (jqXHR) ->
@app.ajaxError(jqXHR)
onStartAttachRecording: (lessonId) ->
if @uploading
logger.warn("rejecting startAttachRecording attempt as currently busy")
return
@lessonId = lessonId
@ui.launchRecordingSelectorDialog([], (recordings) =>
@recordingsSelected(recordings)
)
@changed()
onStartAttachNotation: (lessonId) ->
if @uploading
logger.warn("rejecting onStartAttachNotation attempt as currently busy")
return
@lessonId = lessonId
logger.debug("notation upload started for lesson: " + lessonId)
@triggerNotation()
@changed()
onStartAttachAudio: (lessonId) ->
if @uploading
logger.warn("rejecting onStartAttachAudio attempt as currently busy")
return
@lessonId = lessonId
logger.debug("audio upload started for lesson: " + lessonId)
@triggerAudio()
@changed()
triggerNotation: () ->
if !@attachNotationBtn?
@attachNotationBtn = $('input.attachment-notation').eq(0)
@attachNotationBtn.trigger('click')
triggerAudio: () ->
if !@attachAudioBtn?
@attachAudioBtn = $('input.attachment-audio').eq(0)
@attachAudioBtn.trigger('click')
onUploadNotations: (notations, doneCallback, failCallback) ->
logger.debug("beginning upload of notations", notations)
@uploading = true
@changed()
formData = new FormData()
maxExceeded = false;
$.each(notations, (i, file) => (
max = 10 * 1024 * 1024;
if file.size > max
maxExceeded = true
return false
formData.append('files[]', file)
))
if maxExceeded
@app.notify({
title: "Maximum Music Notation Size Exceeded",
text: "You can only upload files up to 10 megabytes in size."
})
failCallback()
@uploading = false
@changed()
return
formData.append('lesson_session_id', @lessonId);
formData.append('attachment_type', 'notation')
@app.layout.showDialog('music-notation-upload-dialog')
rest.uploadMusicNotations(formData)
.done((response) => @doneUploadingNotatations(notations, response, doneCallback, failCallback))
.fail((jqXHR) => @failUploadingNotations(jqXHR, failCallback))
doneUploadingNotatations: (notations, response, doneCallback, failCallback) ->
@uploading = false
@changed()
error_files = [];
$.each(response, (i, music_notation) => (
if music_notation.errors
error_files.push(notations[i].name)
)
)
if error_files.length > 0
failCallback()
@app.notifyAlert("Failed to upload notations.", error_files.join(', '));
else
doneCallback()
failUploadingNotations: (jqXHR, failCallback) ->
@uploading = false
@changed()
if jqXHR.status == 413
# the file is too big. Let the user know.
# This should happen when they select the file, but a misconfiguration on the server could cause this.
@app.notify({
title: "Maximum Music Notation Size Exceeded",
text: "You can only upload files up to 10 megabytes in size."
})
else
@app.notifyServerError(jqXHR, "Unable to upload music notations");
onUploadAudios: (notations, doneCallback, failCallback) ->
logger.debug("beginning upload of audio", notations)
@uploading = true
@changed()
formData = new FormData()
maxExceeded = false;
$.each(notations, (i, file) => (
max = 10 * 1024 * 1024;
if file.size > max
maxExceeded = true
return false
formData.append('files[]', file)
))
if maxExceeded
@app.notify({
title: "Maximum Music Audio Size Exceeded",
text: "You can only upload files up to 10 megabytes in size."
})
failCallback()
@uploading = false
@changed()
return
formData.append('lesson_session_id', @lessonId);
formData.append('attachment_type', 'audio')
@app.layout.showDialog('music-notation-upload-dialog')
rest.uploadMusicNotations(formData)
.done((response) => @doneUploadingAudios(notations, response, doneCallback, failCallback))
.fail((jqXHR) => @failUploadingAudios(jqXHR, failCallback))
doneUploadingAudios: (notations, response, doneCallback, failCallback) ->
@uploading = false
@changed()
error_files = [];
$.each(response, (i, music_notation) => (
if music_notation.errors
error_files.push(notations[i].name)
)
)
if error_files.length > 0
failCallback()
@app.notifyAlert("Failed to upload audio files.", error_files.join(', '));
else
doneCallback()
failUploadingAudios: (jqXHR, failCallback) ->
@uploading = false
@changed()
if jqXHR.status == 413
# the file is too big. Let the user know.
# This should happen when they select the file, but a misconfiguration on the server could cause this.
@app.notify({
title: "Maximum Music Audio Size Exceeded",
text: "You can only upload files up to 10 megabytes in size."
})
else
@app.notifyServerError(jqXHR, "Unable to upload music audio files");
changed: () ->
this.trigger({lessonId: @lessonId, uploading: @uploading})
}
)