Files
penracourses/static/filer/js/addons/dropzone.init.js
T
Ross 3367328d94 .
2021-07-26 10:48:08 +01:00

172 lines
6.3 KiB
JavaScript

// #DROPZONE#
// This script implements the dropzone settings
/* globals Dropzone, django */
'use strict';
// as of Django 2.x we need to check where jQuery is
var djQuery = window.$;
if (django.jQuery) {
djQuery = django.jQuery;
}
if (Dropzone) {
Dropzone.autoDiscover = false;
}
/* globals Dropzone, django */
djQuery(function ($) {
var dropzoneTemplateSelector = '.js-filer-dropzone-template';
var previewImageSelector = '.js-img-preview';
var dropzoneSelector = '.js-filer-dropzone';
var dropzones = $(dropzoneSelector);
var messageSelector = '.js-filer-dropzone-message';
var lookupButtonSelector = '.js-related-lookup';
var progressSelector = '.js-filer-dropzone-progress';
var previewImageWrapperSelector = '.js-img-wrapper';
var filerClearerSelector = '.filerClearer';
var fileChooseSelector = '.js-file-selector';
var fileIdInputSelector = '.vForeignKeyRawIdAdminField';
var dragHoverClass = 'dz-drag-hover';
var hiddenClass = 'hidden';
var mobileClass = 'filer-dropzone-mobile';
var objectAttachedClass = 'js-object-attached';
// var dataMaxFileSize = 'max-file-size';
var minWidth = 500;
var checkMinWidth = function (element) {
element.toggleClass(mobileClass, element.width() < minWidth);
};
var showError = function (message) {
try {
window.parent.CMS.API.Messages.open({
message: message
});
} catch (e) {
if (window.filerShowError) {
window.filerShowError(message);
} else {
alert(message);
}
}
};
var createDropzone = function () {
var dropzone = $(this);
var dropzoneUrl = dropzone.data('url');
var inputId = dropzone.find(fileIdInputSelector);
var isImage = inputId.is('[name="image"]');
var lookupButton = dropzone.find(lookupButtonSelector);
var message = dropzone.find(messageSelector);
var clearButton = dropzone.find(filerClearerSelector);
var fileChoose = dropzone.find(fileChooseSelector);
if (this.dropzone) {
return;
}
$(window).on('resize', function () {
checkMinWidth(dropzone);
});
new Dropzone(this, {
url: dropzoneUrl,
paramName: 'file',
maxFiles: 1,
// for now disabled as we don't have the correct file size limit
// maxFilesize: dropzone.data(dataMaxFileSize) || 20, // MB
previewTemplate: $(dropzoneTemplateSelector).html(),
clickable: false,
addRemoveLinks: false,
init: function () {
checkMinWidth(dropzone);
this.on('removedfile', function () {
fileChoose.show();
dropzone.removeClass(objectAttachedClass);
this.removeAllFiles();
clearButton.trigger('click');
});
$('img', this.element).on('dragstart', function (event) {
event.preventDefault();
});
clearButton.on('click', function () {
dropzone.removeClass(objectAttachedClass);
inputId.trigger('change');
});
},
maxfilesexceeded: function () {
this.removeAllFiles(true);
},
drop: function () {
this.removeAllFiles(true);
fileChoose.hide();
lookupButton.addClass('related-lookup-change');
message.addClass(hiddenClass);
dropzone.removeClass(dragHoverClass);
dropzone.addClass(objectAttachedClass);
},
success: function (file, response) {
$(progressSelector).addClass(hiddenClass);
if (file && file.status === 'success' && response) {
if (response.file_id) {
inputId.val(response.file_id);
inputId.trigger('change');
}
if (response.thumbnail_180) {
if (isImage) {
$(previewImageSelector).css({
'background-image': 'url(' + response.thumbnail_180 + ')'
});
$(previewImageWrapperSelector).removeClass(hiddenClass);
}
}
} else {
if (response && response.error) {
showError(file.name + ': ' + response.error);
}
this.removeAllFiles(true);
}
$('img', this.element).on('dragstart', function (event) {
event.preventDefault();
});
},
error: function (file, response) {
showError(file.name + ': ' + response.error);
this.removeAllFiles(true);
},
reset: function () {
if (isImage) {
$(previewImageWrapperSelector).addClass(hiddenClass);
$(previewImageSelector).css({'background-image': 'none'});
}
dropzone.removeClass(objectAttachedClass);
inputId.val('');
lookupButton.removeClass('related-lookup-change');
message.removeClass(hiddenClass);
inputId.trigger('change');
}
});
};
if (dropzones.length && Dropzone) {
if (!window.filerDropzoneInitialized) {
window.filerDropzoneInitialized = true;
Dropzone.autoDiscover = false;
}
dropzones.each(createDropzone);
// window.__admin_utc_offset__ is used as canary to detect Django 1.8
// There is no way to feature detect the new behavior implemented in Django 1.9
if (!window.__admin_utc_offset__) {
$(document).on('formset:added', function (ev, row) {
var dropzones = $(row).find(dropzoneSelector);
dropzones.each(createDropzone);
});
} else {
$('.add-row a').on('click', function () {
var dropzones = $(dropzoneSelector);
dropzones.each(createDropzone);
});
}
}
});