Welcome to mirror list, hosted at ThFree Co, Russian Federation.

blob_file_dropzone.js « blob « javascripts « assets « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 9010cd0c3c1aeb5dc2f80b39149f1bdf4b12795e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/* eslint-disable func-names, object-shorthand, prefer-arrow-callback */

import $ from 'jquery';
import Dropzone from 'dropzone';
import { visitUrl } from '../lib/utils/url_utility';
import { HIDDEN_CLASS } from '../lib/utils/constants';
import csrf from '../lib/utils/csrf';
import { sprintf, __ } from '~/locale';

Dropzone.autoDiscover = false;

function toggleLoading($el, $icon, loading) {
  if (loading) {
    $el.disable();
    $icon.removeClass(HIDDEN_CLASS);
  } else {
    $el.enable();
    $icon.addClass(HIDDEN_CLASS);
  }
}
export default class BlobFileDropzone {
  constructor(form, method) {
    const formDropzone = form.find('.dropzone');
    const submitButton = form.find('#submit-all');
    const submitButtonLoadingIcon = submitButton.find('.js-loading-icon');
    const dropzoneMessage = form.find('.dz-message');
    Dropzone.autoDiscover = false;

    const dropzone = formDropzone.dropzone({
      autoDiscover: false,
      autoProcessQueue: false,
      url: form.attr('action'),
      // Rails uses a hidden input field for PUT
      // http://stackoverflow.com/questions/21056482/how-to-set-method-put-in-form-tag-in-rails
      method: method,
      clickable: true,
      uploadMultiple: false,
      paramName: 'file',
      maxFilesize: gon.max_file_size || 10,
      parallelUploads: 1,
      maxFiles: 1,
      addRemoveLinks: true,
      previewsContainer: '.dropzone-previews',
      headers: csrf.headers,
      init: function() {
        this.on('addedfile', function() {
          toggleLoading(submitButton, submitButtonLoadingIcon, false);
          dropzoneMessage.addClass(HIDDEN_CLASS);
          $('.dropzone-alerts')
            .html('')
            .hide();
        });
        this.on('removedfile', function() {
          toggleLoading(submitButton, submitButtonLoadingIcon, false);
          dropzoneMessage.removeClass(HIDDEN_CLASS);
        });
        this.on('success', function(header, response) {
          $('#modal-upload-blob').modal('hide');
          visitUrl(response.filePath);
        });
        this.on('maxfilesexceeded', function(file) {
          dropzoneMessage.addClass(HIDDEN_CLASS);
          this.removeFile(file);
        });
        this.on('sending', function(file, xhr, formData) {
          formData.append('branch_name', form.find('.js-branch-name').val());
          formData.append('create_merge_request', form.find('.js-create-merge-request').val());
          formData.append('commit_message', form.find('.js-commit-message').val());
        });
      },
      // Override behavior of adding error underneath preview
      error: function(file, errorMessage) {
        const stripped = $('<div/>')
          .html(errorMessage)
          .text();
        $('.dropzone-alerts')
          .html(sprintf(__('Error uploading file: %{stripped}'), { stripped }))
          .show();
        this.removeFile(file);
      },
    });

    submitButton.on('click', e => {
      e.preventDefault();
      e.stopPropagation();
      if (dropzone[0].dropzone.getQueuedFiles().length === 0) {
        // eslint-disable-next-line no-alert
        alert(__('Please select a file'));
        return false;
      }
      toggleLoading(submitButton, submitButtonLoadingIcon, true);
      dropzone[0].dropzone.processQueue();
      return false;
    });
  }
}