/**
* @file js/controllers/form/FileUploadFormHandler.js
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class FileUploadFormHandler
* @ingroup js_controllers_form
*
* @brief File upload form handler.
*/
(function($) {
/**
* @constructor
*
* @extends $.pkp.controllers.form.AjaxFormHandler
*
* @param {jQueryObject} $form The wrapped HTML form element.
* @param {{
* readOnly: boolean,
* resetUploader: boolean,
* $uploader: jQueryObject,
* $preview: jQueryObject,
* uploaderOptions: Object
* }} options Form validation options.
*/
$.pkp.controllers.form.FileUploadFormHandler =
function($form, options) {
this.parent($form, options);
if (options.readOnly === undefined || options.readOnly === null) {
if (options.resetUploader !== undefined) {
this.resetUploader_ = options.resetUploader;
}
// An optional preview container for the file. If this option is passed
// the preview container will be hidden when a new file is uploaded and
// when the `fileDeleted` event is fired.
if (options.$preview !== undefined && options.$preview.length) {
this.$preview = options.$preview;
this.bind('fileDeleted', this.callbackWrapper(this.fileDeleted));
}
// Attach the uploader handler to the uploader HTML element.
this.attachUploader_(options.$uploader, options.uploaderOptions);
this.uploaderSetup(options.$uploader);
}
};
$.pkp.classes.Helper.inherits(
$.pkp.controllers.form.FileUploadFormHandler,
$.pkp.controllers.form.AjaxFormHandler);
/**
* Reset the uploader widget flag.
* @private
* @type {boolean}
*/
$.pkp.controllers.form.FileUploadFormHandler.prototype.
resetUploader_ = false;
/**
* The file preview DOM element. A jQuery object when available
* @protected
* @type {boolean|jQueryObject}
*/
$.pkp.controllers.form.FileUploadFormHandler.prototype.
$preview = false;
//
// Extended methods from AjaxFormHandler.
//
/**
* @inheritDoc
*/
$.pkp.controllers.form.FileUploadFormHandler.prototype.handleResponse =
function(formElement, jsonData) {
var fileUploader;
if (this.resetUploader_) {
fileUploader = $('#plupload', this.getHtmlElement())
.plupload('getUploader');
fileUploader.splice();
fileUploader.refresh();
// Reset the temporary file id value.
$('#temporaryFileId', this.getHtmlElement()).val('');
}
return /** @type {boolean} */ (
this.parent('handleResponse', formElement, jsonData));
};
//
// Public methods
//
/**
* The setup callback of the uploader.
* @param {jQueryObject} $uploader Element that contains the plupload object.
*/
$.pkp.controllers.form.FileUploadFormHandler.prototype.
uploaderSetup = function($uploader) {
var uploadHandler = $.pkp.classes.Handler.getHandler($uploader);
// Subscribe to uploader events.
uploadHandler.pluploader.bind('FileUploaded',
this.callbackWrapper(this.handleUploadResponse));
};
/**
* Handle the response of a "file upload" request.
* @param {Object} caller The original context in which the callback was called.
* @param {Object} pluploader The pluploader object.
* @param {Object} file The data of the uploaded file.
* @param {{response: string}} ret The serialized JSON response.
*/
$.pkp.controllers.form.FileUploadFormHandler.prototype.
handleUploadResponse = function(caller, pluploader, file, ret) {
// Handle the server's JSON response.
var jsonData = /** @type {boolean|{uploadedFile: Object,
temporaryFileId: string, content: string}} */
(this.handleJson($.parseJSON(ret.response))),
$uploadForm, $temporaryFileId;
if (jsonData !== false) {
// Trigger the file uploaded event.
this.trigger('fileUploaded', [jsonData.uploadedFile]);
// Hide preview if one exists
if (this.$preview) {
this.$preview.hide();
}
if (jsonData.content === '') {
// Successful upload to temporary file; save to main form.
$uploadForm = this.getHtmlElement();
$temporaryFileId = $uploadForm.find('#temporaryFileId');
$temporaryFileId.val(jsonData.temporaryFileId);
} else {
// Display the revision confirmation form.
this.replaceWith(jsonData.content);
}
}
};
/**
* Fires when the file has been removed
*/
$.pkp.controllers.form.FileUploadFormHandler.prototype.
fileDeleted = function() {
if (this.$preview) {
this.$preview.hide();
}
};
//
// Private methods
//
/**
* Attach the uploader handler.
* @private
* @param {jQueryObject} $uploader The wrapped HTML uploader element.
* @param {Object} options Uploader options.
*/
$.pkp.controllers.form.FileUploadFormHandler.prototype.
attachUploader_ = function($uploader, options) {
// Attach the uploader handler to the uploader div.
$uploader.pkpHandler('$.pkp.controllers.UploaderHandler', options);
};
}(jQuery));
|