Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit b9c42e2

Browse files
committedJun 17, 2020
Added FileFormType for fields.js (it was deleted by mistake).
1 parent 282e88c commit b9c42e2

File tree

1 file changed

+209
-0
lines changed

1 file changed

+209
-0
lines changed
 

‎Resources/public/fields.js

+209
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,215 @@
837837
{
838838
return new VideoCollectionFormType(this, options, callback);
839839
};
840+
841+
/**
842+
* Constructor
843+
*
844+
* @param {jQuery} $wrapper
845+
* @param {object} options
846+
*/
847+
function BaseFileFormType($wrapper, options)
848+
{
849+
this.wrapper = $wrapper;
850+
this.options = $.extend({
851+
uploadUrl : null,
852+
deleteUrl : null,
853+
requestId : null,
854+
splashScreen : null,
855+
editMediaContentFactory : null,
856+
messages: {
857+
dictMaxFilesExceeded: "You can't download files more than",
858+
serverError: 'An error occurred on the server.'
859+
}
860+
}, options);
861+
862+
// Define UI elements
863+
this.ui = {
864+
uploadFileWrapper : $wrapper.find('.js-upload-file-wrapper'), // Area has upload button
865+
uploadPreviewTemplate : $wrapper.find('.js-preview-template-wrapper').html(), // Preview template
866+
uploadPreviewWrapper : $wrapper.find('.js-preview-wrapper'), // Where display previews
867+
fieldValue : $wrapper.find('.js-field-value'), // hidden input
868+
869+
controlBar : {
870+
uploadFile: $wrapper.find('.js-control-bar-upload-file'), // Upload zone
871+
editFile: $wrapper.find('.js-control-bar-edit-file')
872+
}
873+
};
874+
875+
// Define listeners
876+
this.defineListeners();
877+
}
878+
879+
// Extends from BaseMediaFormType
880+
BaseFileFormType.prototype = Object.create(BaseMediaFormType.prototype);
881+
BaseFileFormType.prototype.constructor = BaseFileFormType;
882+
883+
/**
884+
* Define listeners
885+
*/
886+
BaseFileFormType.prototype.defineListeners = function ()
887+
{
888+
var self = this;
889+
890+
// On click edit file
891+
$(document).on('click', this.ui.controlBar.editFile.selector, function(){
892+
var $preview = $(this).closest('.js-dropzone-file');
893+
894+
splashScreen = self.options.splashScreen;
895+
if (splashScreen === null || splashScreen === undefined) {
896+
throw new Error('Splash screen plugin is not defined.');
897+
}
898+
899+
var data = self.getPreviewData($preview);
900+
data['media'] = '<img class="js-file splash-screen-file" src="' + data['content_path'] + '">';
901+
902+
var editMediaContent = self.options.editMediaContentFactory.create(data);
903+
var $splashScreenContent = editMediaContent.getContent();
904+
905+
splashScreen.content($splashScreenContent);
906+
907+
// On save success
908+
$splashScreenContent.bind('saveSuccess', function(e, response, data) {
909+
self.setPreviewName($preview, data.name);
910+
self.setDataForPreview($preview, data);
911+
});
912+
});
913+
};
914+
915+
/**
916+
* Set name
917+
*
918+
* @param {jQuery} $previewElement
919+
* @param {string} name
920+
*/
921+
BaseFileFormType.prototype.setPreviewName = function ($previewElement, name)
922+
{
923+
$previewElement.find('.js-file-name').text(name);
924+
};
925+
926+
/**
927+
* Constructor
928+
*
929+
* @param {jQuery} $wrapper
930+
* @param {object} options
931+
* @param {function} callback
932+
*/
933+
function FileFormType($wrapper, options, callback)
934+
{
935+
BaseFileFormType.apply(this, arguments);
936+
937+
this.options = $.extend({
938+
file: {}
939+
}, this.options);
940+
941+
this.storedFile = null;
942+
this.isShowStoredFile = null;
943+
944+
this.dropzoneUploader = this.initDropzoneUploader(options.uploadUrl, options.deleteUrl, options.file);
945+
946+
if (callback !== undefined) {
947+
callback(this);
948+
}
949+
}
950+
951+
// Extends from BaseFileFormType
952+
FileFormType.prototype = Object.create(BaseFileFormType.prototype);
953+
FileFormType.prototype.constructor = FileFormType;
954+
955+
/**
956+
* Init dropzone uploader
957+
*
958+
* @param {string} uploadUrl
959+
* @param {string} deleteUrl
960+
* @param {object} fileItem
961+
*/
962+
FileFormType.prototype.initDropzoneUploader = function (uploadUrl, deleteUrl, fileItem)
963+
{
964+
var self = this;
965+
var dropzoneUploader = $(this.ui.controlBar.uploadFile).dropzoneUploader({
966+
url: uploadUrl,
967+
deleteUrl: deleteUrl,
968+
previewsContainer: this.ui.uploadPreviewWrapper.selector,
969+
previewTemplate: this.ui.uploadPreviewTemplate,
970+
requestId: this.options.requestId,
971+
maxFiles: 1,
972+
messages: {
973+
dictMaxFilesExceeded: this.options.dictMaxFilesExceeded,
974+
serverError: this.options.serverError
975+
}
976+
});
977+
978+
if (!$.isEmptyObject(fileItem)) {
979+
var mockFile = dropzoneUploader.addFile(fileItem.id, fileItem.name, fileItem.size, fileItem.thumbnail_path);
980+
981+
self.storedFile = mockFile;
982+
self.isShowStoredFile = true;
983+
self.ui.uploadFileWrapper.hide();
984+
985+
$previewElement = $(mockFile.previewElement);
986+
$previewElement.show();
987+
988+
self.setPreviewName($previewElement, fileItem.name);
989+
self.setDataForPreview($previewElement, fileItem);
990+
}
991+
992+
var dropzone = dropzoneUploader.dropzone;
993+
994+
// On maxfilesexceeded
995+
dropzone.on("maxfilesexceeded", function(file) {
996+
this.removeAllFiles();
997+
this.addFile(file);
998+
});
999+
1000+
// On success
1001+
dropzone.on("success", function(file, response) {
1002+
if (self.storedFile) {
1003+
$(self.storedFile.previewElement).hide();
1004+
self.isShowStoredFile = false;
1005+
}
1006+
1007+
// Set data for preview
1008+
$previewElement = $(file.previewElement);
1009+
$previewElement.show();
1010+
1011+
self.setPreviewName($previewElement, response.name);
1012+
self.setDataForPreview($previewElement, response);
1013+
1014+
self.ui.uploadFileWrapper.hide();
1015+
});
1016+
1017+
// On remove file
1018+
dropzone.on("removedfile", function(file, response) {
1019+
if (self.isShowStoredFile) {
1020+
self.storedFile = null;
1021+
self.isShowStoredFile = false;
1022+
1023+
} else {
1024+
self.isShowStoredFile = true;
1025+
}
1026+
1027+
if (self.storedFile) {
1028+
$(self.storedFile.previewElement).show();
1029+
1030+
} else {
1031+
self.ui.uploadFileWrapper.show();
1032+
}
1033+
});
1034+
1035+
return dropzoneUploader;
1036+
};
1037+
1038+
/**
1039+
* Init plugin
1040+
*
1041+
* @param {object} options
1042+
* @param {function} callback
1043+
* @returns {FileFormType}
1044+
*/
1045+
$.fn.fileFormType = function (options, callback)
1046+
{
1047+
return new FileFormType(this, options, callback);
1048+
};
8401049
})(jQuery);
8411050

8421051
(function ($) {

0 commit comments

Comments
 (0)