This repository has been archived on 2025-01-19. You can view files and clone it, but cannot push or open issues or pull requests.
drupalcampbristol/web/modules/contrib/webform/js/webform.element.managed_file.js
2018-11-23 12:29:20 +00:00

110 lines
3.8 KiB
JavaScript

/**
* @file
* JavaScript behaviors for managed file uploads.
*/
(function ($, Drupal) {
'use strict';
/**
* Track file uploads and display confirm dialog when an file upload is inprogress.
*
* @type {Drupal~behavior}
*/
Drupal.behaviors.webformManagedFileAutoUpload = {
attach: function attach(context) {
// Add submit handler to file upload form.
$(context).find('form')
.once('webform-auto-file-upload')
.on('submit', function (event) {
var $form = $(this);
if ($form.data('webform-auto-file-uploads') > 0 && blockSubmit($form)) {
event.preventDefault();
return false;
}
return true;
});
// Add submit handler to form.beforeSend.
// Update Drupal.Ajax.prototype.beforeSend only once.
if (typeof Drupal.Ajax !== 'undefined' && typeof Drupal.Ajax.prototype.beforeSubmitWebformManagedFileAutoUploadOriginal === 'undefined') {
Drupal.Ajax.prototype.beforeSubmitWebformManagedFileAutoUploadOriginal = Drupal.Ajax.prototype.beforeSubmit;
Drupal.Ajax.prototype.beforeSubmit = function (form_values, element_settings, options) {
var $form = this.$form;
var $element = $(this.element);
// Determine if the triggering element is within .form-actions.
var isFormActions = $element
.closest('.form-actions').length;
// Determine if the triggering element is within a multiple element.
var isMultipleUpload = $element
.parents('.js-form-type-webform-multiple, .js-form-type-webform-custom-composite')
.find('.js-form-managed-file').length;
// Determine if the triggering element is not within a
// managed file element.
var isManagedUploadButton = $element.parents('.js-form-managed-file').length;
// Only trigger block submit for .form-actions and multiple element
// with file upload.
if ($form.data('webform-auto-file-uploads') > 0 &&
(isFormActions || (isMultipleUpload && !isManagedUploadButton)) &&
blockSubmit($form)) {
this.ajaxing = false;
return false;
}
return this.beforeSubmitWebformManagedFileAutoUploadOriginal();
};
}
$(context).find('input[type="file"]').once('webform-auto-file-upload').on('change', function () {
// Track file upload.
$(this).data('msk-auto-file-upload', true);
// Increment form file uploads.
var $form = $(this.form);
var fileUploads = ($form.data('webform-auto-file-uploads') || 0);
$form.data('webform-auto-file-uploads', fileUploads + 1);
});
},
detach: function detach(context, settings, trigger) {
if (trigger === 'unload') {
$(context).find('input[type="file"]').removeOnce('webform-auto-file-upload').each(function () {
if ($(this).data('msk-auto-file-upload')) {
// Remove file upload tracking.
$(this).removeData('msk-auto-file-upload');
// Decrease form file uploads.
var $form = $(this.form);
var fileUploads = ($form.data('webform-auto-file-uploads') || 0);
$form.data('webform-auto-file-uploads', fileUploads - 1);
}
});
}
}
};
/**
* Block form submit.
*
* @param {jQuery} form
* A form.
*
* @return {boolean}
* TRUE if form submit should be blocked.
*/
function blockSubmit(form) {
if ($(form).data('webform-auto-file-uploads') < 0) {
return false;
}
var message = Drupal.t('File upload inprogress. Uploaded file may be lost.') +
'\n' +
Drupal.t('Do you want to continue?');
return !window.confirm(message);
}
})(jQuery, Drupal);