|
@@ -937,7 +937,7 @@
|
|
},
|
|
},
|
|
_showUploadError: function (msg, params, event) {
|
|
_showUploadError: function (msg, params, event) {
|
|
var self = this, $error = self.$errorContainer, ev = event || 'fileuploaderror', e = params && params.id ?
|
|
var self = this, $error = self.$errorContainer, ev = event || 'fileuploaderror', e = params && params.id ?
|
|
- '<li data-file-id="' + params.id + '">' + msg + '</li>' : '<li>' + msg + '</li>';
|
|
|
|
|
|
+ '<li data-file-id="' + params.id + '">' + msg + '</li>' : '<li>' + msg + '</li>';
|
|
if ($error.find('ul').length === 0) {
|
|
if ($error.find('ul').length === 0) {
|
|
self._addError('<ul>' + e + '</ul>');
|
|
self._addError('<ul>' + e + '</ul>');
|
|
} else {
|
|
} else {
|
|
@@ -1200,12 +1200,8 @@
|
|
}
|
|
}
|
|
},
|
|
},
|
|
_submitForm: function () {
|
|
_submitForm: function () {
|
|
- var self = this, $el = self.$element, files = $el.get(0).files;
|
|
|
|
- if (files && self.minFileCount > 0 && self._getFileCount(files.length) < self.minFileCount) {
|
|
|
|
- self._noFilesError({});
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- return !self._abort({});
|
|
|
|
|
|
+ var self = this;
|
|
|
|
+ return self._isFileSelectionValid() && !self._abort({});
|
|
},
|
|
},
|
|
_clearPreview: function () {
|
|
_clearPreview: function () {
|
|
var self = this, $p = self.$preview,
|
|
var self = this, $p = self.$preview,
|
|
@@ -3325,6 +3321,20 @@
|
|
self.filenames = newnames;
|
|
self.filenames = newnames;
|
|
self.fileids = newids;
|
|
self.fileids = newids;
|
|
},
|
|
},
|
|
|
|
+ _isFileSelectionValid: function(cnt) {
|
|
|
|
+ var self = this;
|
|
|
|
+ cnt = cnt || 0;
|
|
|
|
+ if (self.required && !self.getFilesCount()) {
|
|
|
|
+ self.$errorContainer.html('');
|
|
|
|
+ self._showUploadError(self.msgFileRequired);
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ if (self.minFileCount > 0 && self._getFileCount(cnt) < self.minFileCount) {
|
|
|
|
+ self._noFilesError({});
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+ },
|
|
clearStack: function () {
|
|
clearStack: function () {
|
|
var self = this;
|
|
var self = this;
|
|
self.filestack = [];
|
|
self.filestack = [];
|
|
@@ -3472,9 +3482,8 @@
|
|
self._raise('filedisabled');
|
|
self._raise('filedisabled');
|
|
self.$element.attr('disabled', 'disabled');
|
|
self.$element.attr('disabled', 'disabled');
|
|
self.$container.find(".kv-fileinput-caption").addClass("file-caption-disabled");
|
|
self.$container.find(".kv-fileinput-caption").addClass("file-caption-disabled");
|
|
- self.$container.find(".btn-file, .fileinput-remove, .fileinput-upload, .file-preview-frame button").attr(
|
|
|
|
- "disabled",
|
|
|
|
- true);
|
|
|
|
|
|
+ self.$container.find(".btn-file, .fileinput-remove, .fileinput-upload, .file-preview-frame button")
|
|
|
|
+ .attr("disabled", true);
|
|
self._initDragDrop();
|
|
self._initDragDrop();
|
|
return self.$element;
|
|
return self.$element;
|
|
},
|
|
},
|
|
@@ -3484,19 +3493,15 @@
|
|
self._raise('fileenabled');
|
|
self._raise('fileenabled');
|
|
self.$element.removeAttr('disabled');
|
|
self.$element.removeAttr('disabled');
|
|
self.$container.find(".kv-fileinput-caption").removeClass("file-caption-disabled");
|
|
self.$container.find(".kv-fileinput-caption").removeClass("file-caption-disabled");
|
|
- self.$container.find(
|
|
|
|
- ".btn-file, .fileinput-remove, .fileinput-upload, .file-preview-frame button").removeAttr("disabled");
|
|
|
|
|
|
+ self.$container.find(".btn-file, .fileinput-remove, .fileinput-upload, .file-preview-frame button")
|
|
|
|
+ .removeAttr("disabled");
|
|
self._initDragDrop();
|
|
self._initDragDrop();
|
|
return self.$element;
|
|
return self.$element;
|
|
},
|
|
},
|
|
upload: function () {
|
|
upload: function () {
|
|
- var self = this, totLen = self.getFileStack().length, params = {}, i, outData, len,
|
|
|
|
|
|
+ var self = this, totLen = self.getFileStack().length, i, outData, len,
|
|
hasExtraData = !$.isEmptyObject(self._getExtraData());
|
|
hasExtraData = !$.isEmptyObject(self._getExtraData());
|
|
- if (!self.isUploadable || self.isDisabled) {
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- if (self.minFileCount > 0 && self._getFileCount(totLen) < self.minFileCount) {
|
|
|
|
- self._noFilesError(params);
|
|
|
|
|
|
+ if (!self.isUploadable || self.isDisabled || !self._isFileSelectionValid(totLen)) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
self._resetUpload();
|
|
self._resetUpload();
|
|
@@ -3642,6 +3647,7 @@
|
|
browseOnZoneClick: false,
|
|
browseOnZoneClick: false,
|
|
autoReplace: false,
|
|
autoReplace: false,
|
|
autoOrientImage: true, // for JPEG images based on EXIF orientation tag
|
|
autoOrientImage: true, // for JPEG images based on EXIF orientation tag
|
|
|
|
+ required: false,
|
|
generateFileId: null,
|
|
generateFileId: null,
|
|
previewClass: '',
|
|
previewClass: '',
|
|
captionClass: '',
|
|
captionClass: '',
|
|
@@ -3761,6 +3767,7 @@
|
|
msgNoFilesSelected: 'No files selected',
|
|
msgNoFilesSelected: 'No files selected',
|
|
msgCancelled: 'Cancelled',
|
|
msgCancelled: 'Cancelled',
|
|
msgZoomModalHeading: 'Detailed Preview',
|
|
msgZoomModalHeading: 'Detailed Preview',
|
|
|
|
+ msgFileRequired: 'You must select a file to upload.',
|
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
|
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
|
|
msgSizeTooLarge: 'File "{name}" (<b>{size} KB</b>) exceeds maximum allowed upload size of <b>{maxSize} KB</b>.',
|
|
msgSizeTooLarge: 'File "{name}" (<b>{size} KB</b>) exceeds maximum allowed upload size of <b>{maxSize} KB</b>.',
|
|
msgFilesTooLess: 'You must select at least <b>{n}</b> {files} to upload.',
|
|
msgFilesTooLess: 'You must select at least <b>{n}</b> {files} to upload.',
|