uppy-8.x-1.x-dev/js/uppy_integration.js

js/uppy_integration.js
/**
 * @file
 */

(function($, drupalSettings) {

  function uppySendTusComplete (resp, fidTarget) {
    var uploadKey = resp.url.split('/').slice(-1).pop();

    var ajax_settings = {
      type: 'POST',
      contentType: 'application/json;charset=utf-8',
      dataType: 'json',
      processData: false,
      data: JSON.stringify({fileName: resp.file.name}),
      url: drupalSettings.path.baseUrl + 'tus/upload-complete/' + uploadKey
    };

    // Send ajax call to inform upload complete, and put value in the field.
    $.ajax(ajax_settings).done(function(response) {
      $(fidTarget).val(response.fid);
    });
  }

  /**
   * Attaches the Uppy widget to each Uppy form element.
   */
  Drupal.behaviors.uppy = {
    attach: function (context, settings) {
      const elements = once('uppy-widget-init', '.uppy-widget', context);
      elements.forEach(function (value, index) {
        var $this = $(value);

        // Abort the init process if upload input is not available.
        var parent = $this.closest('.uppy-file');
        var fileField = parent.find('input[type="file"]').first();
        if (!fileField.length) {
          return;
        }
        // Hide core upload widget.
        fileField.hide();

        // Merge the default settings and the element settings to get a full
        // settings object to pass to the Plupload library for this element.
        var id = $this.attr('id');
        var defaultSettings = settings.uppy['_default'] ? settings.uppy['_default'] : {};
        var elementSettings = (id && settings.uppy[id]) ? settings.uppy[id] : {};
        var uppySettings = $.extend({}, defaultSettings, elementSettings);

        // Target for fids.
        var fidField = uppySettings.fieldName + '[' + uppySettings.delta + "][fids]";

        // Get or create the target fids hidden input.
        var fidTarget = parent.find('input[name="' + fidField + '"]').first();
        if (!fidTarget.length) {
          fidTarget = $('<input>').attr('name', fidField).attr('type','hidden').appendTo(parent);
        }

        // Initialize Uppy.
        var uppy = Uppy.Core({
          id: id,
          inline: true,
          autoProceed: uppySettings.auto_proceed || false,
          restrictions: {
            maxFileSize: uppySettings.max_file_size || null,
            maxNumberOfFiles: uppySettings.max_number_of_files || null,
            allowedFileTypes: uppySettings.allowed_file_types || null
          },
          meta: {
            entityType: uppySettings.entityType,
            entityBundle: uppySettings.entityBundle,
            fieldName: uppySettings.fieldName
          },
          onBeforeFileAdded: function(currentFile, files) {
            var callbacks = settings.uppyOverrides[id].overrides.onBeforeFileAddedCallbacks;
            if (!callbacks) {
              return true;
            }

            for (var key in callbacks) {
              var callback = callbacks[key];
              var returnVal = callback(currentFile, files);

              if (returnVal === false) {
                return false;
              }
              if (returnVal !== true) {
                currentFile = returnVal;
              }
            }

            return currentFile;
          },
          onBeforeUpload: function (files) {
            var callbacks = settings.uppyOverrides[id].overrides.onBeforeUploadCallbacks;
            if (!callbacks) {
              return true;
            }

            for (var key in callbacks) {
              var callback = callbacks[key];
              var returnVal = callback(files);

              if (returnVal === false) {
                return false;
              }
              if (returnVal !== true) {
                files = returnVal;
              }
            }

            return files;
          },
        });
        // Keep track of it globally.
        settings.uppyOverrides = settings.uppyOverrides || {};
        // set the overrides and uppy instance for the current field identified by "id"
        settings.uppyOverrides[id] = settings.uppyOverrides[id] || {};
        settings.uppyOverrides[id].overrides = settings.uppyOverrides[id].overrides || {};
        settings.uppyOverrides[id].instance = uppy;
        // Use the @uppy/dashboard widget.
        uppy.use(Uppy.Dashboard, Object.assign({
          target: '#' + id,
          height: "auto",
        }, uppySettings.dashboard));
        // If we're using TUS.
        if (uppySettings.uploader.length && uppySettings.uploader === 'tus') {
          uppy.use(Uppy.Tus, {
            endpoint: drupalSettings.path.baseUrl + 'tus/upload',
            resume: true,
            autoRetry: true,
            limit: 0,
            overridePatchMethod: true,
            retryDelays: [1000, 2000, 3000, 4000],
            chunkSize: uppySettings.chunk_size,
            removeFingerprintOnSuccess: uppySettings.remove_fingerprint_success,
          });

          // Inform TUS (and Drupal) that the upload is complete.
          uppy.on('upload-success', function(file, resp) {
            uppySendTusComplete(resp, fidTarget);
          });
        }

      });
    }
  };

})(jQuery, drupalSettings);

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc