Jelajahi Sumber

Upgrade to release v4.1.4

Kartik Visweswaran 10 tahun lalu
induk
melakukan
023b004f62
8 mengubah file dengan 154 tambahan dan 124 penghapusan
  1. 11 0
      CHANGE.md
  2. 56 34
      README.md
  3. 1 1
      bower.json
  4. 1 1
      css/fileinput.css
  5. 1 1
      css/fileinput.min.css
  6. 1 1
      examples/index.html
  7. 82 85
      js/fileinput.js
  8. 1 1
      js/fileinput.min.js

+ 11 - 0
CHANGE.md

@@ -1,3 +1,14 @@
+version 4.1.4
+=============
+**Date:** 26-Dec-2014
+
+1. (enh #88): Allow uploadExtraData to be passed as a callback.
+2. (enh #89): New `otherActionButtons` to allow adding customized initial preview content actions.
+3. (enh #90): New event `filebatchpreupload` for both synchronous and asynchronous batch uploads.
+4. (enh #91): Pass FileReader instance with outData in events.
+5. (enh #92): Realign event triggering timing for batch uploads to ensure outData is available.
+6. Code cleanup with reusable methods for event raising and outData generation.
+
 version 4.1.3
 =============
 **Date:** 20-Dec-2014

+ 56 - 34
README.md

@@ -7,7 +7,7 @@ The plugin incorporates a simple HTML markup with enhanced CSS styling of a HTML
 
 ![File Input Screenshot](https://lh3.googleusercontent.com/-3FiEmc_okc4/VBw_d2LBAJI/AAAAAAAAAL8/KbVj5X9Dus0/w596-h454-no/FileInput.jpg)
 
-> NOTE: The latest version of the plugin v4.1.3 has been released. Refer the [CHANGE LOG](https://github.com/kartik-v/bootstrap-fileinput/blob/master/CHANGE.md) for details. 
+> NOTE: The latest version of the plugin v4.1.4 has been released. Refer the [CHANGE LOG](https://github.com/kartik-v/bootstrap-fileinput/blob/master/CHANGE.md) for details. 
 
 ## Features  
 
@@ -42,26 +42,16 @@ The plugin incorporates a simple HTML markup with enhanced CSS styling of a HTML
 15. Raise new `fileimageuploaded` event that fires after image is completely loaded on the preview container.
 16. Autosize preview images when they exceed the size of the preview container.
 17. Completely templatized and extensible to allow configuration of the file-input the way the developer wants.
-18. Preview intelligence based on various file preview types. The inbuilt file support types are categorized as 
-  `image`, `text`, `html`, `video`,  `audio`, `flash`, `object`, and `other`.
-19. `allowedPreviewTypes`: You can now configure which all file types are allowed to be shown as a preview. This defaults to `['image', 'html', 'text', 'video', 'audio', 'flash', 'object']`.
-   Thus all file types are treated as an object to preview by default. For exampleTo preview only `image` and `video`, you can set this to `['image', 'video']`.
-20. `allowedPreviewMimeTypes`: In addition to `allowedPreviewTypes`, you can also control which all mime types can be displayed for preview. This defaults to null,
-   meaning all mime types are supported.
+18. Preview intelligence based on various file preview types. The inbuilt file support types are categorized as `image`, `text`, `html`, `video`,  `audio`, `flash`, `object`, and `other`.
+19. `allowedPreviewTypes`: You can now configure which all file types are allowed to be shown as a preview. This defaults to `['image', 'html', 'text', 'video', 'audio', 'flash', 'object']`. Thus all file types are treated as an object to preview by default. For exampleTo preview only `image` and `video`, you can set this to `['image', 'video']`.
+20. `allowedPreviewMimeTypes`: In addition to `allowedPreviewTypes`, you can also control which all mime types can be displayed for preview. This defaults to null, meaning all mime types are supported.
    >NOTE: With release 2.5.0 you can now control which file types or extensions are allowed for upload by setting `allowedFileTypes` and `allowedFileExtensions`.
-21. `layoutTemplates`: Allows you to configure all layout template settings within one property. The layout objects that can be configured are: `main1`, `main2`,
-   `preview`, `caption`, and `modal`.
-22. `previewTemplates`: All preview templates for **each preview type** have been combined into one property, instead of separate templates for image, text etc. 
-   The keys are the formats as set in `allowedPreviewTypes` and values are the templates used for previewing. There are default prebuilt templates for each 
-   preview file type (`generic`, `image`, `text`, `html`, `video`,  `audio`, `flash`, `object`, and `other`). The `generic` template is used only for displaying
-   `initialPreview` content using direct markup.
-23. `previewSettings`: Allows you to configure width and height for each preview image type. The plugin has default widths and heights predefined for each type i.e
-   `image`, `text`, `html`, `video`,  `audio`, `flash`, and `object`.
-24. `fileTypeSettings`: Allows you to configure and identify each preview file type using a callback. The plugin has default callbacks predefined to identify each type i.e
-   `image`, `text`, `html`, `video`,  `audio`, `flash`, and `object`.
+21. `layoutTemplates`: Allows you to configure all layout template settings within one property. The layout objects that can be configured are: `main1`, `main2`, `preview`, `caption`, and `modal`.
+22. `previewTemplates`: All preview templates for **each preview type** have been combined into one property, instead of separate templates for image, text etc. The keys are the formats as set in `allowedPreviewTypes` and values are the templates used for previewing. There are default prebuilt templates for each preview file type (`generic`, `image`, `text`, `html`, `video`,  `audio`, `flash`, `object`, and `other`). The `generic` template is used only for displaying `initialPreview` content using direct markup.
+23. `previewSettings`: Allows you to configure width and height for each preview image type. The plugin has default widths and heights predefined for each type i.e `image`, `text`, `html`, `video`,  `audio`, `flash`, and `object`.
+24. `fileTypeSettings`: Allows you to configure and identify each preview file type using a callback. The plugin has default callbacks predefined to identify each type i.e `image`, `text`, `html`, `video`,  `audio`, `flash`, and `object`.
 25. Replacing tags within templates has been enhanced. With this release it will automatically check for multiple occurrences of each tag to replace within a template string.
 
-
 ### File Upload Features
 
 With release 4.0.0, the plugin now also includes inbuilt support for AJAX Uploads and selectively adding or deleting files. AJAX upload functionality are 
@@ -819,6 +809,11 @@ Defaults to the following setting:
 }
 ```
 
+#### otherActionButtons
+_string_ markup for additional action buttons to display within the initial preview thumbnails (for example displaying an image edit button). The following tags can be used in the markup and will be automatically replaced:
+
+- `{dataKey}`: Will be replaced with the `key` set within `initialPreviewConfig`.    
+
 #### textEncoding
 _string_ the encoding to be used while reading a text file. Applicable only for previewing text files. Defaults to `UTF-8`. 
 
@@ -849,7 +844,7 @@ $('#input-id').on('filecleared', function(event) {
 This event is triggered when a client validation error is encountered for an uploaded file. 
 Additional parameters available are: 
 
-- `file`: the FileReader instance 
+- `file`: the file object instance
 - `previewId`: the identifier for the preview file container.
 - `index`: the zero-based sequential index of the loaded file in the preview list
 
@@ -864,7 +859,7 @@ $('#input-id').on('fileerror', function(event, file, previewId, index) {
 This event is triggered after a file is loaded in the preview. Additional parameters available 
 are: 
 
-- `file`: the FileReader instance 
+- `file`: the file object instance
 - `previewId`: the identifier for the preview file container.
 - `index`: the zero-based sequential index of the loaded file in the preview list
 
@@ -980,7 +975,7 @@ This event is triggered when an error is faced in deletion of each thumbnail fil
 - `index`: the zero-based index of the file in the preview container.
 
 ```js
-$('#input-id').on('filedeleteerror', function(event, formdata, preview, index) {
+$('#input-id').on('filedeleteerror', function(event, data, preview, index) {
     console.log('File delete error');
 });
 ```
@@ -993,32 +988,35 @@ This event is triggered before upload of each thumbnail file. Additional paramet
     - `files`: the file stack array (or empty object if not available).
     - `extra`: the `uploadExtraData` settings for the plugin (or empty object if not available).
     - `response`: the data sent via ajax response (or empty object if not available).
+    - `reader`: the FileReader instance if available.
 - `previewId`: the identifier of the preview thumbnail container.
 - `index`: the zero-based index of the file in the preview container.
 
 ```js
 $('#input-id').on('filepreupload', function(event, data, previewId, index) {
-    var formdata = data.form, files = data.files, 
-        extradata = data.extra, responsedata = data.response;
+    var form = data.form, files = data.files, extra = data.extra, 
+        response = data.response, reader = data.reader;
     console.log('File pre upload triggered');
 });
 ```
 
 #### fileuploaded
-This event is triggered after upload is completed for each thumbnail file. Additional parameters available are: 
+This event is triggered after upload is completed for each thumbnail file. Note this event is also triggered for 
+asynchronous batch uploads after each file in the selection is uploaded via ajax. Additional parameters available are: 
 
 - `data`: This is a data object (associative array) that sends the following information, whose keys are:
     - `form`: the FormData object which is passed via XHR2 (or empty object if not available).
     - `files`: the file stack array (or empty object if not available).
     - `extra`: the `uploadExtraData` settings for the plugin (or empty object if not available).
     - `response`: the data sent via ajax response (or empty object if not available).
+    - `reader`: the FileReader instance if available.
 - `previewId`: the identifier of each file's parent thumbnail div element in the preview window.
 - `index`: the zero-based index of the file in the file stack.
 
 ```js
 $('#input-id').on('fileuploaded', function(event, data, previewId, index) {
-    var formdata = data.form, files = data.files, 
-        extradata = data.extra, responsedata = data.response;
+    var form = data.form, files = data.files, extra = data.extra, 
+        response = data.response, reader = data.reader;
     console.log('File uploaded triggered');
 });
 ```
@@ -1031,17 +1029,37 @@ This event is triggered when an upload or file input validation error is encount
     - `files`: the file stack array (or empty object if not available).
     - `extra`: the `uploadExtraData` settings for the plugin (or empty object if not available).
     - `response`: the data sent via ajax response (or empty object if not available).
+    - `reader`: the FileReader instance if available.
 - `previewId`: the identifier of each file's parent thumbnail div element in the preview window.
 - `index`: the zero-based index of the file in the file stack.
 
 ```js
 $('#input-id').on('fileuploaderror', function(event, data, previewId, index) {
-    var formdata = data.form, files = data.files, 
-        extradata = data.extra, responsedata = data.response;
+    var form = data.form, files = data.files, extra = data.extra, 
+        response = data.response, reader = data.reader;
     console.log('File upload error');
 });
 ```
 
+#### filebatchpreupload
+This event is triggered before a batch upload (for both synchronous and asynchronous uploads) after the upload button is clicked. 
+Additional parameters available are: 
+
+- `data`: This is a data object (associative array) that sends the following information, whose keys are:
+    - `form`: the FormData object which is passed via XHR2 (or empty object if not available).
+    - `files`: the file stack array (or empty object if not available).
+    - `extra`: the `uploadExtraData` settings for the plugin (or empty object if not available).
+    - `response`: the data sent via ajax response (or empty object if not available).
+    - `reader`: the FileReader instance if available.
+
+```js
+$('#input-id').on('filebatchpreupload', function(event, data) {
+    var form = data.form, files = data.files, extra = data.extra, 
+        response = data.response, reader = data.reader;
+    console.log('File batch pre upload triggered');
+});
+```
+
 #### filebatchuploadsuccess
 This event is triggered after a successful synchronous batch upload (i.e. when `uploadAsync` is `false`). Additional parameters available are: 
 
@@ -1050,11 +1068,12 @@ This event is triggered after a successful synchronous batch upload (i.e. when `
     - `files`: the file stack array (or empty object if not available).
     - `extra`: the `uploadExtraData` settings for the plugin (or empty object if not available).
     - `response`: the data sent via ajax response (or empty object if not available).
+    - `reader`: the FileReader instance if available.
 
 ```js
 $('#input-id').on('filebatchuploadsuccess', function(event, data) {
-    var formdata = data.form, files = data.files, 
-        extradata = data.extra, responsedata = data.response;
+    var form = data.form, files = data.files, extra = data.extra, 
+        response = data.response, reader = data.reader;
     console.log('File batch upload success');
 });
 ```
@@ -1067,11 +1086,12 @@ This event is triggered when any error is faced in the synchronous batch upload
     - `files`: the file stack array (or empty object if not available).
     - `extra`: the `uploadExtraData` settings for the plugin (or empty object if not available).
     - `response`: the data sent via ajax response (or empty object if not available).
+    - `reader`: the FileReader instance if available.
 
 ```js
 $('#input-id').on('filebatchuploaderror', function(event, data) {
-    var formdata = data.form, files = data.files, 
-        extradata = data.extra, responsedata = data.response;
+    var form = data.form, files = data.files, extra = data.extra, 
+        response = data.response, reader = data.reader;
     console.log('File upload error');
 });
 ```
@@ -1084,10 +1104,12 @@ This event is triggered after completion of either the synchronous and asynchron
     - `files`: the file stack array (or empty object if not available).
     - `extra`: the `uploadExtraData` settings for the plugin (or empty object if not available).
     - `response`: the data sent via ajax response (or empty object if not available).
+    - `reader`: the FileReader instance if available.
+
 ```js
 $('#input-id').on('filebatchuploadcomplete', function(event, data) {
-    var formdata = data.form, files = data.files, 
-        extradata = data.extra, responsedata = data.response;
+    var form = data.form, files = data.files, extra = data.extra, 
+        response = data.response, reader = data.reader;
     console.log('File batch upload complete');
 });
 ```

+ 1 - 1
bower.json

@@ -1,6 +1,6 @@
 {
     "name": "bootstrap-fileinput",
-    "version": "4.1.3",
+    "version": "4.1.4",
     "homepage": "https://github.com/kartik-v/bootstrap-fileinput",
     "authors": [
         "Kartik Visweswaran <[email protected]>"

+ 1 - 1
css/fileinput.css

@@ -1,7 +1,7 @@
 /*!
  * @copyright Copyright &copy; Kartik Visweswaran, Krajee.com, 2014
  * @package bootstrap-fileinput
- * @version 4.1.3
+ * @version 4.1.4
  *
  * File input styling for Bootstrap 3.0
  * Built for Yii Framework 2.0

+ 1 - 1
css/fileinput.min.css

@@ -1,7 +1,7 @@
 /*!
  * @copyright Copyright &copy; Kartik Visweswaran, Krajee.com, 2014
  * @package bootstrap-fileinput
- * @version 4.1.3
+ * @version 4.1.4
  *
  * File input styling for Bootstrap 3.0
  * Built for Yii Framework 2.0

+ 1 - 1
examples/index.html

@@ -1,5 +1,5 @@
 <!DOCTYPE html>
-<!-- release v4.1.3, copyright 2014 Kartik Visweswaran -->
+<!-- release v4.1.4, copyright 2014 Kartik Visweswaran -->
 <html lang="en">
     <head>
         <meta charset="UTF-8"/>

+ 82 - 85
js/fileinput.js

@@ -1,6 +1,6 @@
 /*!
  * @copyright Copyright &copy; Kartik Visweswaran, Krajee.com, 2014
- * @version 4.1.3
+ * @version 4.1.4
  *
  * File input styled for Bootstrap 3.0 that utilizes HTML5 File Input's advanced 
  * features including the FileReader API. 
@@ -115,7 +115,7 @@
             '</div>',
         actions: '<div class="file-actions">\n' +
             '    <div class="file-footer-buttons">\n' +
-            '        {upload}{delete}' +
+            '        {upload}{delete}{other}' +
             '    </div>\n' +
             '    <div class="file-upload-indicator" tabindex="-1" title="{indicatorTitle}">{indicator}</div>\n' +
             '    <div class="clearfix"></div>\n' +
@@ -314,6 +314,14 @@
             self.uploadPercent = 0;
             self.$element.removeClass('file-loading');
         },
+        raise: function(event) {
+            var self = this;
+            if (arguments.length > 1) {
+                self.$element.trigger(event, arguments[1]);
+            } else {
+                self.$element.trigger(event);
+            }
+        },
         getLayoutTemplate: function(t) {
             var self = this;
             return isSet(t, self.layoutTemplates) ? self.layoutTemplates[t] : defaultLayoutTemplates[t];
@@ -322,6 +330,17 @@
             var self = this;
             return isSet(t, self.previewTemplates) ? self.previewTemplates[t] : defaultPreviewTemplates[t];
         },
+        getOutData: function (formdata) {
+            var self = this, responsedata = arguments.length > 1 ? arguments[1] : {},
+                filesdata = arguments.length > 2 ? arguments[2] : self.filestack;
+            return {
+                form: formdata,
+                files: filesdata,
+                extra: self.getExtraData(),
+                response: responsedata,
+                reader: self.reader
+            };
+        },
         listen: function () {
             var self = this, $el = self.$element, $cap = self.$captionContainer, $btnFile = self.$btnFile;
             $el.on('change', $.proxy(self.change, self));
@@ -331,7 +350,7 @@
                 }, 50);  
             });
             $btnFile.on('click', function (ev) {
-                self.$element.trigger('filebrowse');
+                self.raise('filebrowse');
                 if (self.isError && !self.isUploadable) {
                     self.clear(false);
                 }
@@ -363,11 +382,22 @@
                 self.lock();
                 self.setProgress(0);
                 if ((self.uploadAsync || totLen == 1) && self.showPreview) {
+                    var outData = self.getOutData(null);
+                    self.raise('filebatchpreupload', [outData]);
                     for (i = 0; i < len; i++) {
                         if (self.filestack[i] !== undefined) {
                             self.upload(i, self.getFileStack(), true);
                         }
                     }
+                    setTimeout(function() {
+                        $(document).ajaxStop(function() {
+                            self.setProgress(100);
+                            self.$preview.find('file-preview-frame').removeClass('file-loading');
+                            self.unlock();
+                            self.clearFileInput();
+                            self.raise('filebatchuploadcomplete', [self.filestack, self.getExtraData()]);
+                        });
+                    }, 100);
                     return;
                 }
                 self.uploadBatch();
@@ -387,7 +417,7 @@
             if (self.showCancel) {
                 self.$container.find('.fileinput-cancel').removeClass('hide');
             }
-            self.$element.trigger('filelock', [self.filestack, self.uploadExtraData]);
+            self.raise('filelock', [self.filestack, self.getExtraData()]);
         },
         unlock: function() {
             var self = this;
@@ -398,7 +428,7 @@
             if (self.showRemove) {
                 self.$container.find('.fileinput-remove').removeClass('hide');
             }
-            self.$element.trigger('fileunlock', [self.filestack, self.uploadExtraData]);
+            self.raise('fileunlock', [self.filestack, self.getExtraData()]);
         },
         refresh: function (options) {
             var self = this, $el = self.$element,
@@ -529,6 +559,7 @@
                 btnDelete = self.getLayoutTemplate('actionDelete'), 
                 btnUpload = '', 
                 template = self.getLayoutTemplate('actions'), 
+                otherActionButtons = self.otherActionButtons.replace(/\{dataKey\}/g, vKey),
                 config = self.fileActionSettings,
                 removeClass = disabled ? config.removeClass + ' disabled' : config.removeClass;
             btnDelete = btnDelete
@@ -545,7 +576,8 @@
             }
             return template
                 .replace(/\{delete\}/g, btnDelete)
-                .replace(/\{upload\}/g, btnUpload);
+                .replace(/\{upload\}/g, btnUpload)
+                .replace(/\{other\}/g, otherActionButtons);
         },
         getInitialPreview: function(template, content, i) {
             var self = this, ind = 'init_' + i,
@@ -615,11 +647,11 @@
                         beforeSend: function() {
                             addCss($frame, 'file-uploading');
                             addCss($el, 'disabled');
-                            self.$element.trigger('filepredelete', [vKey]);
+                            self.raise('filepredelete', [vKey]);
                         },
                         success: function(data, textStatus, jqXHR) {
                             if(typeof data.error === 'undefined') {
-                                self.$element.trigger('filedeleted', [vKey]);
+                                self.raise('filedeleted', [vKey]);
                             } else {
                                 self.showError(data.error, null, $el.attr('id'), key, 'filedeleteerror');
                                 resetProgress();
@@ -734,8 +766,8 @@
             self.resetErrors(true);
             
             if (e !== false) {
-                self.$element.trigger('change');
-                self.$element.trigger('fileclear');
+                self.raise('change');
+                self.raise('fileclear');
             }
             if (self.overwriteInitial) {
                 self.initialPreviewCount = 0;
@@ -765,7 +797,7 @@
                 self.$captionContainer.find('.kv-caption-icon').hide();
             }
             self.hideFileIcon();
-            self.$element.trigger('filecleared');
+            self.raise('filecleared');
             self.$captionContainer.focus();
             self.setFileDropZoneTitle();
         },
@@ -775,7 +807,7 @@
             self.$preview.html(self.original.preview);
             self.$caption.html(self.original.caption);
             self.$container.find('.fileinput-filename').text('');
-            self.$element.trigger('filereset');
+            self.raise('filereset');
             if (self.initialPreview.length > 0) {
                 self.$container.removeClass('file-input-new');
             }
@@ -801,12 +833,19 @@
             self.$container.find(".btn-file, .fileinput-remove, .kv-fileinput-upload").removeAttr("disabled");
             self.initDragDrop();
         },
+        getExtraData: function() {
+            var self = this, data = self.uploadExtraData;
+            if (typeof(self.uploadExtraData) == "function") {
+                data = self.uploadExtraData();
+            }
+            return data;
+        },
         uploadExtra: function(fd) {
-            var self = this;
-            if (self.uploadExtraData.length == 0) {
+            var self = this, data = self.getExtraData();
+            if (data.length == 0) {
                 return;
             }
-            $.each(self.uploadExtraData, function(key, value) {
+            $.each(data, function(key, value) {
                 if (!isEmpty(key) && !isEmpty(value)) {
                     fd.append(key, value);
                 }
@@ -844,13 +883,7 @@
                     $indicator.attr('title', config[msg]);
                 },
                 updateProgress = function() {
-                    if (allFiles && self.uploadPercent >= 100) {
-                        self.unlock();
-                        self.clearFileInput();
-                        self.$element.trigger('filebatchuploadcomplete', [self.filestack, self.uploadExtraData]);
-                        return;
-                    }
-                    if (!allFiles || total == 0) {
+                    if (!allFiles || total == 0 || self.uploadPercent >= 100) {
                         return;
                     }
                     self.uploadCount++;
@@ -858,16 +891,12 @@
                     self.uploadPercent = Math.max(pct, self.uploadPercent);
                     self.setProgress(self.uploadPercent);
                     self.initPreviewDeletes();
-                    if (allFiles && self.uploadPercent >= 100) {
-                        self.$element.trigger('filebatchuploadcomplete', [self.filestack, self.uploadExtraData]);
-                    }
                 },
                 resetActions = function() {
                     $btnUpload.removeAttr('disabled');
                     $btnDelete.removeAttr('disabled');
                     $thumb.removeClass('file-uploading');
                 };
-            
             formdata.append(self.uploadFileAttr, files[i]);
             formdata.append('file_id', i);
             self.uploadExtra(formdata);
@@ -884,12 +913,7 @@
                 processData: false,
                 contentType: false,
                 beforeSend: function() {
-                    var outData = {
-                        form: formdata,
-                        files: self.filestack,
-                        extra: self.uploadExtraData,
-                        response: {}
-                    };
+                    var outData = self.getOutData(formdata);
                     setIndicator('indicatorLoading', 'indicatorLoadingTitle');
                     addCss($thumb, 'file-uploading');
                     $btnUpload.attr('disabled', true);
@@ -897,22 +921,17 @@
                     if (!allFiles) {
                         self.lock();
                     }
-                    self.$element.trigger('filepreupload', [outData, previewId, i])
+                    self.raise('filepreupload', [outData, previewId, i])
                 },
                 success: function(data, textStatus, jqXHR) {
-                    var outData = {
-                        form: formdata,
-                        files: self.filestack,
-                        extra: self.uploadExtraData,
-                        response: data
-                    };
+                    var outData = self.getOutData(formdata, data);
                     setTimeout(function() {
                         if(typeof data.error === 'undefined') {
                             setIndicator('indicatorSuccess', 'indicatorSuccessTitle');
                             $btnUpload.hide();
                             $btnDelete.hide();
                             self.filestack[i] = undefined;
-                            self.$element.trigger('fileuploaded', [outData, previewId, i]);
+                            self.raise('fileuploaded', [outData, previewId, i]);
                         } else {
                             setIndicator('indicatorError', 'indicatorErrorTitle');
                             self.showUploadError(data.error, outData, previewId, i);
@@ -927,12 +946,7 @@
                 },
                 error: function(jqXHR, textStatus, errorThrown) {
                     setIndicator('indicatorError', 'indicatorErrorTitle');
-                    var outData = {
-                        form: formdata,
-                        files: self.filestack,
-                        extra: self.uploadExtraData,
-                        response: {}
-                    };
+                    var outData = self.getOutData(formdata);
                     if (allFiles) {
                         var cap = files[i].name;
                         self.showUploadError('<b>' + cap + '</b>: ' + errorThrown, outData, previewId, i);
@@ -987,6 +1001,7 @@
                 contentType: false,
                 beforeSend: function() {
                     self.lock();
+                    var outData = self.getOutData(formdata);
                     if (!self.showPreview) {
                         return;
                     }
@@ -996,16 +1011,13 @@
                         $btnUpload.attr('disabled', true);
                         $btnDelete.attr('disabled', true);
                     });
+                    self.raise('filebatchpreupload', [outData]);
                 },
                 success: function(data, textStatus, jqXHR) {
-                    var outData = {
-                        form: formdata,
-                        files: self.filestack,
-                        extra: self.uploadExtraData,
-                        response: data
-                    };
+                    var outData = self.getOutData(formdata, data);
                     var keys = isEmpty(data.errorkeys) ? [] : data.errorkeys;
                     if(typeof data.error === 'undefined' || isEmpty(data.error)) {
+                        self.raise('filebatchuploadsuccess', [outData]);
                         setAllUploaded();
                         if (self.showPreview) {
                             self.$preview.find('.kv-file-upload').hide();
@@ -1018,7 +1030,6 @@
                         } else {
                             self.reset();
                         }
-                        self.$element.trigger('filebatchuploadsuccess', [outData]);
                     } else {
                         self.$preview.find('.file-preview-frame').each(function() {
                             var $thumb = $(this), key = $thumb.attr('data-fileindex');
@@ -1042,16 +1053,11 @@
                 complete: function () {
                     self.setProgress(100);
                     self.unlock();
-                    self.$element.trigger('filebatchuploadcomplete', [self.filestack, self.uploadExtraData]);
+                    self.raise('filebatchuploadcomplete', [self.filestack, self.getExtraData()]);
                     self.clearFileInput();
                 },
                 error: function(jqXHR, textStatus, errorThrown) {
-                    var outData = {
-                        form: formdata,
-                        files: self.filestack,
-                        extra: self.uploadExtraData,
-                        response: {}
-                    };
+                    var outData = self.getOutData(formdata);
                     self.showUploadError(errorThrown, outData, null, null, 'filebatchuploaderror');
                     self.uploadFileCount = total - 1;
                     self.$preview.find('.file-preview-frame').removeClass('file-uploading');
@@ -1080,7 +1086,7 @@
             }
         },
         showUploadError: function (msg, data, previewId, index) {
-            var self = this, $error = self.$errorContainer, $el = self.$element, 
+            var self = this, $error = self.$errorContainer, 
                 ev = arguments.length > 4 ? arguments[4] : 'fileuploaderror';
             if ($error.find('ul').length == 0) {
                 $error.html('<ul class="text-left"><li>' + msg + '</li></ul>');
@@ -1088,16 +1094,16 @@
                 $error.find('ul').append('<li>' + msg + '</li>');
             }
             $error.fadeIn(800);
-            $el.trigger(ev, [data, previewId, index]);
+            self.raise(ev, [data, previewId, index, self.reader]);
             addCss(self.$container, 'has-error');
             return true;
         },
         showError: function (msg, file, previewId, index) {
-            var self = this, $error = self.$errorContainer, $el = self.$element, 
+            var self = this, $error = self.$errorContainer,
                 ev = arguments.length > 4 ? arguments[4] : 'fileerror';
             $error.html(msg);
             $error.fadeIn(800);
-            $el.trigger(ev, [file, previewId, index]);
+            self.raise(ev, [file, previewId, index, self.reader]);
             if (!self.isUploadable) {
                 self.clearFileInput();
             }
@@ -1229,15 +1235,10 @@
                 wrapLen = parseInt(self.wrapTextLength), wrapInd = self.wrapIndicator,
                 previewInitId = self.previewInitId, numFiles = files.length, settings = self.fileTypeSettings,
                 isText = isSet('text', settings) ? settings['text'] : defaultFileTypeSettings['text'],
-                ctr = self.filestack.length,
+                ctr = self.filestack.length, 
                 throwError = function(msg, file, previewId, index) {
                     self.previewDefault(file, previewId, true);
-                    var outData = {
-                        form: {},
-                        files: files,
-                        extra: self.uploadExtraData,
-                        response: {}
-                    };
+                    var outData = self.getOutData(formdata, {}, files);
                     return self.isUploadable ? self.showUploadError(msg, outData, previewId, index) : self.showError(msg, file, previewId, index);
                 };
             function readFile(i) {
@@ -1287,7 +1288,7 @@
                 if (!self.showPreview) {
                     self.filestack.push(file);
                     setTimeout(readFile(i + 1), 100);
-                    $el.trigger('fileloaded', [file, previewId, i]);
+                    self.raise('fileloaded', [file, previewId, i, reader]);
                     return;
                 }
                 if ($preview.length > 0 && typeof FileReader !== "undefined") {
@@ -1312,7 +1313,7 @@
                             readFile(i + 1);
                             self.updateFileDetails(numFiles);
                         }, 100);
-                        $el.trigger('fileloaded', [file, previewId, i]);
+                        self.raise('fileloaded', [file, previewId, i, reader]);
                     };
                     reader.onprogress = function (data) {
                         if (data.lengthComputable) {
@@ -1336,7 +1337,7 @@
                         readFile(i + 1);
                         self.updateFileDetails(numFiles);
                     }, 100);
-                    $el.trigger('fileloaded', [file, previewId, i]);
+                    self.raise('fileloaded', [file, previewId, i, reader]);
                 }
                 self.filestack.push(file);
             }
@@ -1360,7 +1361,7 @@
             self.setCaption(log);
             self.$container.removeClass('file-input-new');
             if (arguments.length == 1) {
-                $el.trigger('fileselect', [numFiles, label]);
+                self.raise('fileselect', [numFiles, label]);
             }
         },
         change: function (e) {
@@ -1371,12 +1372,7 @@
                 numFiles = !isEmpty(files) ? (files.length + self.initialPreviewCount) : 1, tfiles,
                 ctr = self.filestack.length, isAjaxUpload = (self.isUploadable && ctr != 0),
                 throwError = function(msg, file, previewId, index) {
-                    var outData = {
-                        form: {},
-                        files: files,
-                        extra: self.uploadExtraData,
-                        response: {}
-                    };
+                    var outData = self.getOutData(formdata, {}, files);
                     return self.isUploadable ? self.showUploadError(msg, outData, previewId, index) : self.showError(msg, file, previewId, index);
                 };
             self.resetUpload();
@@ -1398,7 +1394,7 @@
                 if (!isAjaxUpload) {
                     self.clear(false);
                 }
-                $el.trigger('fileselectnone');
+                self.raise('fileselectnone');
                 return;
             }
             self.resetErrors();
@@ -1443,7 +1439,7 @@
                     $cap.width($img.width());
                     $cap.attr('title', $cap.text());
                 }
-                self.$element.trigger('fileimageloaded', previewId);
+                self.raise('fileimageloaded', previewId);
             });
         },
         autoSizeCaption: function() {
@@ -1640,8 +1636,11 @@
         dropZoneTitle: 'Drag & drop files here &hellip;',
         dropZoneTitleClass: 'file-drop-zone-title',
         fileActionSettings: {},
+        otherActionButtons: '',
         textEncoding: 'UTF-8'
     };
+    
+    $.fn.fileinput.Constructor = FileInput;
 
     /**
      * Convert automatically file inputs with class 'file'
@@ -1653,6 +1652,4 @@
             $input.fileinput();
         }
     });
-    
-    $.fn.fileinput.Constructor = FileInput;
 })(window.jQuery);

File diff ditekan karena terlalu besar
+ 1 - 1
js/fileinput.min.js


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini